Ответ 1
Для Rails 4.1 и выше: Model.all
возвращает отношение (там, где оно ранее не было)
Для Rails 4.0: Model.where(nil)
Для Rails 3.x: Model.scoped
Использование Arel in Rails - я ищу способ создания 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, а не фактически выбирать сами записи.
Однако теперь мне нужно включить архивные записи в counts, но relation = Model.all
приводит к Array
, и я ищу ActiveRecord::Relation
.
Единственный способ, которым я могу это сделать, - это model.where(model.arel_table[:id].not_eq(nil))
, который работает, но кажется немного абсурдным.
Может ли кто-нибудь пролить свет на это?
Для Rails 4.1 и выше: Model.all
возвращает отношение (там, где оно ранее не было)
Для Rails 4.0: Model.where(nil)
Для Rails 3.x: Model.scoped
Попробуйте relation = Model.scoped
. Это даст вам отношение вместо фактических результатов.
Вам нужно:
relation = Model.scoped
который, если вы видите какое отношение, на самом деле является ActiveRecord::Relation
.
Как вы можете видеть на этой странице:
http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped
В нем говорится следующее:
Анонимные области, как правило, полезны когда процессуально генерирующий комплекс запросы, в которых прохождение промежуточных значения (области) вокруг как первоклассные объекты удобны.