【问题标题】:Rails has_many with finder_sql and name_scope in combination return nilRails has_many 与 finder_sql 和 name_scope 组合返回 nil
【发布时间】:2011-10-07 13:57:00
【问题描述】:

例如,假设您有:

       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?您只是在复制现有的 ar has_many 查询查找代码
  • 不,我不知道。你看我根本没有 WHERE 条件。
  • 那么我想我完全不知道为什么你的模型设置方式是这样的。如果你想要Something对象的整个集合,你不应该在Model上将它声明为has_many——因为这意味着它是一个一对多的关系。为什么不直接使用您自己的类方法,该方法返回一个 AR::Relation 对象和您正在寻找的 Something 对象?
  • @Filip:您应该接受答案或解释为什么它不好。感谢其他用户的努力。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多