关于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" }
这个正则表达式替换不能正确处理包含子查询的情况。
标签: 技术, RoR, Ruby, RubyOnRails
2 条评论:
ror果然火得不得了。
我喜爱python,对类basic语法的ruby总有一点抵触,呵呵,不好的习惯。
作者 fdcn, 时间 10/03/2006 3:34 上午
我只是简单研究一下啦。
作者 Mountain, 时间 10/03/2006 10:37 上午
发表评论
订阅 博文评论 [Atom]
<< 主页