Ich habe eine Reihe von Objekten, nennen wir es ein Indicator
. Ich möchte Indicator-Klassenmethoden (die der def self.subjects
Sorte, 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_indicators
Methode 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 all
aber 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
where
jedes Mal. def self.subjects
Wie 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.scoped
wie 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 ...