31

在 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
}

这很好用,并且具有COUNT向 MySQL 发起查询的优势,而不是实际选择记录本身。

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

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

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

4

3 回答 3

48

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

于 2011-04-08T13:40:40.597 回答
12

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

对于 Rails 4.0:Model.where(nil)

对于 Rails 3.x:Model.scoped

于 2015-01-30T04:16:36.117 回答
1

你会想要:

relation = Model.scoped

如果你看到什么是关系,它实际上是一个ActiveRecord::Relation.

从这个页面可以看出:

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped

它说:

在程序生成复杂查询时,匿名范围往往很有用,其中将中间值(范围)作为一等对象传递很方便。

于 2011-04-08T13:46:28.610 回答