Has_many का उपयोग करते समय डिप्रेशन चेतावनी: रेल 4 में uniq


95

रेल 4 का उपयोग करते समय एक पदावनति की चेतावनी दी गई है: uniq => true with 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 घोषणा को फिर से लिखने का सही तरीका क्या है?

जवाबों:


237

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

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

6
मैंने वास्तव में इसे अपग्रेड टू रेल्स 4 बुक (यह प्रगति पर है) में देखा है: upgradetorails4.com - इसे कहीं और नहीं मिल सका है।
डायलन मार्कॉ

1
@DylanMarkow रेल्स अपग्रेड करने के लिए लिंक 4 डिफेक्ट है। पुस्तक अब github.com/alindeman/upmissiontorails4
Ivar

1
रेल के साथ 5 के distinctबजाय का उपयोग करें uniq। देखें इस उत्तर अधिक जानकारी के लिए।
निक निलोव

5

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

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

हो सकता है कि यह सिर्फ मेरा हो, लेकिन एसोसिएशन प्रॉक्सी का विस्तार करने के लिए एक स्कोप ब्लॉक का उपयोग करना बहुत ही अनपेक्षित लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.