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

Jer*_*iko 31 activerecord ruby-on-rails 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
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,并且具有COUNT向MySQL发送查询的优势,而不是实际选择记录本身.

但是,我现在需要在计数中包含存档记录,但relation = Model.all结果是Array,我正在寻找ActiveRecord::Relation.

我能想到这样做的唯一方法是model.where(model.arel_table[:id].not_eq(nil)),这有效,但似乎有些荒谬.

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

Dyl*_*kow 48

试试relation = Model.scoped.这将为您提供关系而不是实际结果.


Kyl*_*mus 11

对于Rails 4.1及更高版本:Model.all返回一个关系(之前没有)

对于Rails 4.0: Model.where(nil)

对于Rails 3.x: Model.scoped