Rails 4'te has_many: through: uniq kullanılırken kullanımdan kaldırma uyarısı


95

Rails 4, has_many: through ile: uniq => true kullanılırken bir kullanımdan kaldırma uyarısı getirdi. Örneğin:

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

Aşağıdaki uyarıyı verir:

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'

Yukarıdaki has_many bildirimini yeniden yazmanın doğru yolu nedir?

Yanıtlar:


238

uniqSeçenek bir kapsam bloğu taşındı gerekmektedir. Kapsam bloğunun ikinci parametre olması gerektiğini unutmayın has_many(yani onu satırın sonunda bırakamazsınız, :through => :donationsparçadan önce taşınması gerekir ):

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

Garip görünebilir, ancak birden fazla parametrenizin olduğu durumu düşünürseniz biraz daha mantıklı olur. Örneğin, bu:

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

şu hale gelir:

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

Teşekkürler, bu harika çalışıyor! Bunu nereden buldun? Onu belgelerde hiçbir yerde bulamadım.
Ryan Crispin Heneise

6
Aslında bunu Upgrading to Rails 4 kitabında gördüm (devam ediyor): upgradingtorails4.com - başka hiçbir yerde bulamadım.
Dylan Markow

1
@DylanMarkow Rails 4'e Yükseltme bağlantısı geçersiz. Kitap artık github.com/alindeman/upgradingtorails4
Ivar

1
Rails 5 distinctyerine kullanın uniq. Daha fazla ayrıntı için bu yanıta bakın.
Nic Nilov

5

Dylans cevabına ek olarak, ilişkiyi bir modülle genişletiyorsanız, bunu kapsam bloğunda (ayrı ayrı belirtmenin aksine) zincirlediğinizden emin olun:

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

Belki sadece benim ama bir ilişkilendirme proxy'sini genişletmek için bir kapsam bloğu kullanmak çok mantıksız görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.