Cảnh báo không dùng nữa khi sử dụng has_many: through: uniq trong Rails 4


95

Rails 4 đã đưa ra cảnh báo không dùng nữa khi sử dụng: uniq => true với has_many: through. Ví dụ:

has_many :donors, :through => :donations, :uniq => true

Đưa ra cảnh báo sau:

DEPRECATION WARNING: The following options in your Goal.has_many :donors declaration are deprecated: :uniq. Please use a scope block instead. For example, the following:

    has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment'

should be rewritten as the following:

    has_many :spam_comments, -> { where spam: true }, class_name: 'Comment'

Cách chính xác để viết lại khai báo has_many ở trên là gì?

Câu trả lời:


237

Các uniqtùy chọn cần phải được chuyển thành một khối phạm vi. Lưu ý rằng khối phạm vi cần phải là tham số thứ hai has_many(nghĩa là bạn không thể để nó ở cuối dòng, nó cần được di chuyển trước :through => :donationsphần):

has_many :donors, -> { uniq }, :through => :donations

Nó có thể trông kỳ quặc, nhưng sẽ có ý nghĩa hơn một chút nếu bạn xem xét trường hợp bạn có nhiều tham số. Ví dụ, điều này:

has_many :donors, :through => :donations, :uniq => true, :order => "name", :conditions => "age < 30"

trở thành:

has_many :donors, -> { where("age < 30").order("name").uniq }, :through => :donations

Cảm ơn, điều này hoạt động tuyệt vời! Bạn tìm thấy cái này ở đâu? Tôi không thể tìm thấy nó trong tài liệu ở bất cứ đâu.
Ryan Crispin Heneise

6
Tôi thực sự đã thấy nó trong cuốn sách Nâng cấp lên Rails 4 (nó đang được thực hiện): upgradetorails4.com - tôi không thể tìm thấy nó ở bất kỳ nơi nào khác.
Dylan Markow

1
@DylanMark hiện liên kết để Nâng cấp lên Rails 4 không còn tồn tại. Cuốn sách hiện đã được phát hành theo giấy phép CC tại github.com/alindeman/upgradingtorails4
Ivar

1
Với Rails 5 sử dụng distinctthay vì uniq. Xem câu trả lời này để biết thêm chi tiết.
Nic Nilov

5

Ngoài câu trả lời của Dylans, nếu bạn tình cờ mở rộng liên kết với một mô-đun, hãy đảm bảo rằng bạn liên kết nó trong khối phạm vi (thay vì chỉ định nó một cách riêng biệt), như sau:

has_many :donors,
  -> { extending(DonorExtensions).order(:name).uniq },
  through: :donations

Có lẽ nó chỉ là tôi nhưng có vẻ như rất không trực quan khi sử dụng một khối phạm vi để mở rộng proxy liên kết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.