Rails / Arel:选择所有记录作为ActiveRecord :: Relation

时间:2011-04-08 13:38:43

标签: ruby-on-rails activerecord arel active-relation

在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)),这有效,但似乎有些荒谬。

任何人都可以对此有所了解吗?

3 个答案:

答案 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

它说:

  

匿名范围往往很有用   在程序上产生复杂的   查询,传递中间   值(范围)作为第一类   对象很方便。