Khởi động Rails 4, Model.scoped
hiệ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.scoped
và Model.all
, đó là scoped.scoped
trả về một phạm vi, trong khi all.all
chạ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ề scoped
khi 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 scoped
thà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::Relation
chỉ đơn giản là trả về một phạm vi.
Tôi nên làm gì ở đây?
all
chạ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.