मेरे पास वस्तुओं की एक सरणी है, चलो इसे ए कहते हैं Indicator। मैं def self.subjectsइस सरणी पर संकेतक वर्ग विधियों ( विविधता, स्कोप, आदि) को चलाना चाहता हूं । जिस तरह से मैं वस्तुओं के एक समूह पर वर्ग विधियों को चलाने के लिए जानता हूं वह उन्हें ActiveRecord :: Relation होना है। इसलिए मैं एक to_indicatorsविधि को जोड़ने का सहारा लेता हूं Array।
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
कई बार मैं कक्षा के तरीकों के भीतर, परिणामों को फ़िल्टर करने के लिए इनमें से कुछ स्कोपों को श्रृंखलाबद्ध करता हूं। इसलिए, भले ही मैं एक ActiveRecord :: Relation पर एक विधि कहता हूं, मुझे नहीं पता कि उस वस्तु तक कैसे पहुंचा जाए। मैं केवल इसके माध्यम से सामग्री प्राप्त कर सकता हूं all। लेकिन allएक ऐरे है। तो फिर मुझे उस सरणी को ActiveRecord :: Relation में बदलना होगा। उदाहरण के लिए, यह विधियों में से एक है:
all.to_indicators.applicable_for_bank(id).each do |indicator|
total += indicator.residual_risk_for(id)
indicator_count += 1 if indicator.completed_by?(id)
end
मुझे लगता है कि यह संक्षेपण दो प्रश्नों के नीचे है।
- मैं ऑब्जेक्ट के एक सरणी को ActiveRecord :: Relation में कैसे बदल सकता हूं? अधिमानतः
whereप्रत्येक बार किए बिना । def self.subjectsActiveRecord :: Relation पर एक प्रकार की विधि चलाते समय , मैं उस ActiveRecord :: Relation ऑब्जेक्ट का उपयोग कैसे करूँ?
धन्यवाद। अगर मुझे कुछ भी स्पष्ट करने की आवश्यकता है, तो मुझे बताएं।
.all, तो.scopedएंड्रयू मार्शल के उत्तर की तरह उपयोग करें (हालांकि रेल 4 में यह काम करेगा.all)। यदि आप अपने आप को किसी रिश्ते में एक सरणी मोड़ने की जरूरत महसूस करते हैं, तो आप कहीं गलत हो गए हैं ...