J'ai un tableau d'objets, appelons-le un Indicator. Je veux exécuter des méthodes de classe Indicator (celles de la def self.subjectsvariété, des portées, etc.) sur ce tableau. La seule façon que je connais d'exécuter des méthodes de classe sur un groupe d'objets est de les avoir comme ActiveRecord :: Relation. Alors je to_indicatorsfinis par avoir recours à l'ajout d'une méthode à Array.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Parfois, j'enchaine plusieurs de ces portées pour filtrer les résultats, dans les méthodes de classe. Donc, même si j'appelle une méthode sur un ActiveRecord :: Relation, je ne sais pas comment accéder à cet objet. Je ne peux en obtenir le contenu qu'à travers all. Mais allest un tableau. Alors je dois convertir ce tableau en un ActiveRecord :: Relation. Par exemple, cela fait partie de l'une des méthodes:
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
Je suppose que cela se résume à deux questions.
- Comment puis-je convertir un tableau d'objets en ActiveRecord :: Relation? De préférence sans en faire à
wherechaque fois. - Lors de l'exécution d'une
def self.subjectsméthode de type sur un ActiveRecord :: Relation, comment accéder à cet objet ActiveRecord :: Relation lui-même?
Merci. Si j'ai besoin de clarifier quelque chose, faites-le moi savoir.
.all, utilisez simplement.scopedcomme l'indique la réponse d'Andrew Marshall (bien que dans les rails 4, cela fonctionne avec.all). Si vous avez besoin de transformer un tableau en une relation, vous vous êtes trompé quelque part ...