在Rails中使用Arel - 我正在寻找一种创建ActiveRecord::Relation
的方法,这种方法可以有效地产生SELECT * FROM table
,我仍然可以进一步操作。
例如,我有一个分为多个类别的模型,我按以下方式返回这些类型的计数:
relation = Model.where(:archived => false) # all non-archived records
record_counts = {
:total => relation.count,
:for_sale => relation.where(:for_sale => true).count
:on_auction => relation.where(:on_auction => true).count
}
这很好用,并且具有向MySQL发出COUNT
个查询的优势,而不是实际自己选择记录。
但是,我现在需要在计数中包含已归档的记录,但relation = Model.all
会生成Array
,而我正在寻找ActiveRecord::Relation
。
我能想到这样做的唯一方法是model.where(model.arel_table[:id].not_eq(nil))
,这有效,但似乎有些荒谬。
任何人都可以对此有所了解吗?
答案 0 :(得分:48)
试试relation = Model.scoped
。这将给你关系而不是实际结果。
答案 1 :(得分:11)
对于Rails 4.1及更高版本:Model.all
返回一个关系(之前没有的关系)
对于Rails 4.0:Model.where(nil)
对于Rails 3.x:Model.scoped
答案 2 :(得分:1)
你想要:
relation = Model.scoped
如果您看到什么是关系,那么它实际上是ActiveRecord::Relation
。
从这个页面可以看到:
http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped
它说:
匿名范围往往很有用 在程序上产生复杂的 查询,传递中间 值(范围)作为第一类 对象很方便。