例如,假设您有:

       class Model < AR::Base
         has_many :somethings, :finder_sql => "SELECT * FROM somethings"
       end

       class Something < AR::Base
         named_scope :valuable {...code...}
       end

       # Assume you have one model but 0 somethings:
       # Model.first.somethings          # => [] Good!
       # Model.first.somethings.valuable # => nil Bad! Should return [] !!!

仅当您在 has_many 关系中有 finder_sql 时才会发生这种情况。在其他情况下,它按预期工作。

这是 Rails 2.3.14 的正常行为吗?

最佳答案

是的,如果您指定 finder_sql,那么您将无法附加范围。那是因为 finder_sql 适用于不适合正常 activeRecord 范例的情况。话虽这么说,你构造这个的方式是不正确的。您不需要在这样的关系中存储没有过滤器的 select * 。关系的目的是将过滤器应用于另一个模型。所以,你拥有它的方式 Model.find(params[:id]).somethings 与调用 something.all 完全相同。在后一种情况下,范围将适用于您,因为 .all 可以设置范围。

关于ruby-on-rails - Rails has_many 与 finder_sql 和 name_scope 组合返回 nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7688280/

10-13 04:49