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.subjects
varié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_indicators
finis 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 all
est 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 à
where
chaque fois. - Lors de l'exécution d'une
def self.subjects
mé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.scoped
comme 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 ...