Khởi động Rails 4, Model.scopedhiện không được dùng nữa.
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
Nhưng, có một sự khác biệt trong Model.scopedvà Model.all, đó là scoped.scopedtrả về một phạm vi, trong khi all.allchạy truy vấn.
Trên đường ray 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
Trên đường ray 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
Có những trường hợp sử dụng trong thư viện / mối quan tâm trả về scopedkhi có điều kiện để làm điều gì đó hoặc không làm gì, như vậy:
module AmongConcern
extend ActiveSupport::Concern
module ClassMethods
def among(ids)
return scoped if ids.blank?
where(id: ids)
end
end
end
Nếu bạn thay đổi điều này scopedthành all, bạn sẽ gặp phải các vấn đề ngẫu nhiên tùy thuộc vào vị trí amongđược sử dụng trong chuỗi phạm vi. Ví dụ: Model.where(some: value).among(ids)sẽ chạy truy vấn thay vì trả về một phạm vi.
Những gì tôi muốn là một phương thức idmpotent ActiveRecord::Relationchỉ đơn giản là trả về một phạm vi.
Tôi nên làm gì ở đây?
allchạy truy vấn" không chỉ là tạo tác của bảng điều khiển? Nguồn tin gợi ý rằng nó sẽ hoạt động tốt.