ฉันมีอาร์เรย์ของวัตถุเรียกมันว่าไฟล์Indicator
. ฉันต้องการเรียกใช้เมธอดคลาส 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
เป็น Array. ดังนั้นฉันต้องแปลงอาร์เรย์นั้นเป็น 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
เมธอด type บน ActiveRecord :: Relation ฉันจะเข้าถึงอ็อบเจ็กต์ ActiveRecord :: Relation นั้นได้อย่างไร
ขอบคุณ. หากต้องการชี้แจงอะไรโปรดแจ้งให้เราทราบ
.all
ให้ใช้.scoped
ตามที่คำตอบของ Andrew Marshall ระบุไว้ (แม้ว่าในราง 4 จะใช้งานได้.all
) หากคุณพบว่าตัวเองจำเป็นต้องเปลี่ยนอาร์เรย์ให้เป็นความสัมพันธ์คุณผิดพลาดที่ไหนสักแห่ง ...