笔记与流年

2006/10/02

关于ActiveRecord中的has_many

这两天工作之余在研究RubyOnRails,作了个小例子,感觉还不错。有个错误,简单记一下。

ActiveRecord中has_many关系用finder_sql来定义时需要注意一点,不能用子查询,否则会出错。例如下面的代码是错误的:

has_many :superiors, :class_name => "DAG", :finder_sql =>
'SELECT * FROM dag_nodes ' +
'WHERE id in (' +
'SELECT superior_id FROM dag_node_relations ' +
'WHERE inferior_id=#{id} )'

原因在于active_record/associations/has_many_association.rb中construct_sql方法是如下处理的:

@reflection.options[:counter_sql] =
@reflection.options[:finder_sql].sub(/SELECT (\/\*.*?\*\/ )?(.*)\bFROM\b/im)
{ "SELECT #{$1}COUNT(*) FROM" }

这个正则表达式替换不能正确处理包含子查询的情况。

标签: , , ,

2 条评论:

发表评论

订阅 博文评论 [Atom]



<< 主页