Подтвердить что ты не робот

Rails/Arel: выбор всех записей в качестве ActiveRecord:: Relation

Использование 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)), который работает, но кажется немного абсурдным.

Может ли кто-нибудь пролить свет на это?

4b9b3361

Ответ 1

Для Rails 4.1 и выше: Model.all возвращает отношение (там, где оно ранее не было)

Для Rails 4.0: Model.where(nil)

Для Rails 3.x: Model.scoped

Ответ 2

Попробуйте relation = Model.scoped. Это даст вам отношение вместо фактических результатов.

Ответ 3

Вам нужно:

relation = Model.scoped

который, если вы видите какое отношение, на самом деле является ActiveRecord::Relation.

Как вы можете видеть на этой странице:

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

В нем говорится следующее:

Анонимные области, как правило, полезны когда процессуально генерирующий комплекс запросы, в которых прохождение промежуточных значения (области) вокруг как первоклассные объекты удобны.