2011-04-08 44 views
31

在Rails中使用Arel - 我正在寻找一种创建ActiveRecord::Relation的方法,这有效地导致了SELECT * FROM table,我仍然可以进一步操作。Rails/Arel:选择所有记录作为ActiveRecord ::关系

例如,我的影片分成多个类别的模型,我在下面的方式返回计数这些:

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)),它的工作原理,但似乎有点荒谬。

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

回答

11

对于Rails开发4.1及以上版本:Model.all返回的关系(这在以前是没有)

对于Rails的4.0:Model.where(nil)

对于Rails开发3.X:Model.scoped

+0

On Rails 4.0.13中,'Model.all'返回一个关系,不推荐使用'Model.scoped'。 – Tsutomu 2015-03-01 16:43:57

48

尝试relation = Model.scoped。这会给你的关系,而不是实际的结果。

+0

完美,谢谢!我只能在10分钟内接受。 – Jeriko 2011-04-08 13:43:30

+0

'Model.scoped'在Rails 4.X中已弃用。查看其他答案。 – 2015-01-30 04:17:34

+1

再次感谢,我已经接受了Kyle的答案,因为它提供了不同Rails版本的更完整图片。 – Jeriko 2015-03-30 15:16:10

1

你会想:

relation = Model.scoped 

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

正如你可以从这个网页看到:

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

它说以下内容:

匿名范围往往是有用 在程序上产生复杂的 查询,其中通过中间 值(范围)作为一流的 对象很方便。

+0

'scoped'唯一需要的时刻就是当你想对所有记录进行操作时,比如'Model.all'。只要做一个'Model.where(:archived => false)'就可以返回一个'ActiveRecord :: Relation'对象。 – 2011-04-08 13:54:29