92

रेल 4 ने उपयोग करते समय एक बहिष्करण चेतावनी पेश की है: uniq => true है has_many: through। उदाहरण के लिए:has_many का उपयोग करते समय बहिष्करण चेतावनी: के माध्यम से: रेल में uniq 4

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 घोषणा के पुनर्लेखन के लिए सही तरीका क्या है:

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

निम्नलिखित चेतावनी पैदावार?

उत्तर

230

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 
+0

धन्यवाद, यह बहुत अच्छा काम करता है! आपको यह कहां से मिला? मैं इसे कहीं भी दस्तावेज़ीकरण में नहीं ढूंढ पाया है। – mysmallidea

+6

मैंने वास्तव में इसे रेल 4 पुस्तक (यह प्रगति पर है) में अपग्रेडिंग में देखा: http://www.upgradingtorails4.com/ - इसे कहीं और नहीं ढूंढ पाया है। –

+2

इस संक्षिप्त को उत्तर देने के लिए मुश्किल है। आप महोदय, अधिक उन्नयन के लायक हैं। – courtsimas

5

Dylans जवाब देने के लिए इसके अलावा, यदि आप एक मॉड्यूल के सहयोग का विस्तार किए जाने की भी हो, यह सुनिश्चित करें कि आप इसे गुंजाइश ब्लॉक में श्रृंखला बनाने (के रूप में इसे अलग से निर्दिष्ट करने), इसलिए की तरह करने का विरोध किया:

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

शायद इसकी सिर्फ मुझे लेकिन यह बहुत unintuitive एक संघ प्रॉक्सी का विस्तार करने के एक गुंजाइश ब्लॉक का उपयोग करने लगता है।

संबंधित मुद्दे