मेरे पास वस्तुओं की एक सरणी है, चलो इसे ए कहते हैं 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.subjects
ActiveRecord :: Relation पर एक प्रकार की विधि चलाते समय , मैं उस ActiveRecord :: Relation ऑब्जेक्ट का उपयोग कैसे करूँ?
धन्यवाद। अगर मुझे कुछ भी स्पष्ट करने की आवश्यकता है, तो मुझे बताएं।
.all
, तो.scoped
एंड्रयू मार्शल के उत्तर की तरह उपयोग करें (हालांकि रेल 4 में यह काम करेगा.all
)। यदि आप अपने आप को किसी रिश्ते में एक सरणी मोड़ने की जरूरत महसूस करते हैं, तो आप कहीं गलत हो गए हैं ...