Запуск Rails 4 Model.scoped
тепер застарілий.
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
Але є різниця в Model.scoped
і Model.all
, тобто, scoped.scoped
повертає область, під час all.all
запуску запиту.
На рейках 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
На рейках 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)
виконував би запит, а не повертав область.
Що я хочу, це ідемпотентний метод, ActiveRecord::Relation
який просто повертає область.
Що мені тут робити?
all
запуск запиту" - це не просто артефакт консолі? Джерело припускає, що це повинно працювати дуже добре.