Запуск Rails 4, Model.scoped теперь устарел.
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
Но существует разница в Model.scoped и Model.all, то есть scoped.scoped возвращает область, а all.all запускает запрос.
В Rails 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
В Rails 4:
> Model.all.all.is_a?(ActiveRecord::Relation)
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`).
=> false
В библиотеках/проблемах есть примеры использования, которые возвращают scoped, когда есть условие сделать что-то или ничего, например:
module AmongConcern
extend ActiveSupport::Concern
module ClassMethods
def among(ids)
return scoped if ids.blank?
where(id: ids)
end
end
end
Если вы измените этот scoped на all, вы столкнетесь с случайными проблемами, зависящими от того, где among использовался в цепочке областей видимости. Например, Model.where(some: value).among(ids) будет запускать запрос вместо возврата области.
Я хочу использовать метод idempotent на ActiveRecord::Relation, который просто возвращает область.
Что мне здесь делать?