Rails has_many与finder_sql和name_scope组合返回nil

时间:2011-10-07 13:57:00

标签: ruby-on-rails has-many named-scope

例如,假设你有:

       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的正常行为吗?

1 个答案:

答案 0 :(得分:2)

是的,如果指定finder_sql,那么您将无法追加范围。这是因为finder_sql适用于不适合普通activeRecord范例的情况。话虽如此,你构建它的方式是不正确的。你不应该在这样的关系中存储没有过滤器的select *。关系的目的是将过滤器应用于其他模型。所以,你有它的方式Model.find(params [:id])。somethings与调用Something.all完全相同。在后一种情况下,范围将适用于你。因为.all可以作为范围。