Ich habe eine Reihe von Objekten, nennen wir es ein Indicator. Ich möchte Indicator-Klassenmethoden (die der def self.subjectsSorte, Bereiche usw.) für dieses Array ausführen . Die einzige Möglichkeit, Klassenmethoden für eine Gruppe von Objekten auszuführen, besteht darin, dass sie eine ActiveRecord :: Relation sind. Am Ende greife ich auf das Hinzufügen einer to_indicatorsMethode zurück Array.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Manchmal verkette ich einige dieser Bereiche, um die Ergebnisse innerhalb der Klassenmethoden herauszufiltern. Obwohl ich eine Methode für eine ActiveRecord :: Relation aufrufe, weiß ich nicht, wie ich auf dieses Objekt zugreifen soll. Ich kann nur durch zum Inhalt kommen all. Ist allaber ein Array. Dann muss ich dieses Array in eine ActiveRecord :: Relation konvertieren. Dies ist beispielsweise Teil einer der folgenden Methoden:
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
Ich denke, dies verdichtet sich auf zwei Fragen.
- Wie kann ich ein Array von Objekten in eine ActiveRecord :: Relation konvertieren? Am besten ohne
wherejedes Mal. def self.subjectsWie greife ich beim Ausführen einer Typmethode auf einer ActiveRecord :: Relation auf dieses ActiveRecord :: Relation-Objekt selbst zu?
Vielen Dank. Wenn ich etwas klarstellen muss, lass es mich wissen.
.all, verwenden Sie es einfach.scopedwie in Andrew Marshalls Antwort angegeben (obwohl es in Schienen 4 funktioniert.all). Wenn Sie feststellen, dass Sie ein Array in eine Beziehung verwandeln müssen, sind Sie irgendwo falsch gelaufen ...