คำเตือนการเลิกใช้งานเมื่อใช้ has_many: ถึง: uniq ใน Rails 4


95

Rails 4 ได้แนะนำคำเตือนการเลิกใช้งานเมื่อใช้: uniq => true กับ has_many: through ตัวอย่างเช่น:

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

ให้คำเตือนต่อไปนี้:

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'

อะไรคือวิธีที่ถูกต้องในการเขียนคำประกาศ has_many ด้านบนอีกครั้ง

คำตอบ:


238

uniqตัวเลือกที่จะต้องมีการย้ายเข้ามาบล็อกขอบเขต โปรดทราบว่าบล็อกขอบเขตจะต้องเป็นพารามิเตอร์ที่สองถึงhas_many(เช่นคุณไม่สามารถปล่อยไว้ที่ท้ายบรรทัดได้ต้องย้ายก่อน:through => :donationsส่วน):

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

มันอาจจะดูแปลก แต่ก็สมเหตุสมผลกว่าหากคุณพิจารณากรณีที่คุณมีพารามิเตอร์หลายตัว ตัวอย่างเช่นสิ่งนี้:

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

กลายเป็น:

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

ขอบคุณมันใช้งานได้ดีมาก! คุณพบสิ่งนี้ที่ไหน ฉันไม่สามารถค้นหาในเอกสารได้ทุกที่
Ryan Crispin Heneise

6
จริงๆแล้วฉันเห็นมันในหนังสือการอัปเกรดเป็น Rails 4 (อยู่ระหว่างดำเนินการ): upgradetorails4.com - ไม่สามารถหาได้จากที่อื่น
Dylan Markow

1
@DylanMarkow ลิงก์สำหรับการอัปเกรดเป็น Rails 4 จะหมดอายุ หนังสือเล่มนี้ได้รับการเผยแพร่ภายใต้ใบอนุญาต CC ที่github.com/alindeman/upgradingtorails4
Ivar

1
ด้วย Rails 5 ให้ใช้distinctแทนuniq. ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
Nic Nilov

5

นอกเหนือจากคำตอบของ Dylans แล้วหากคุณกำลังขยายการเชื่อมโยงกับโมดูลตรวจสอบให้แน่ใจว่าคุณเชื่อมโยงไว้ในบล็อกขอบเขต (ตรงข้ามกับการระบุแยกต่างหาก) ดังนี้:

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

อาจจะเป็นแค่ฉัน แต่ดูเหมือนว่าจะใช้การบล็อกขอบเขตเพื่อขยายพร็อกซีการเชื่อมโยงโดยไม่ตั้งใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.