Ho una serie di oggetti, chiamiamola Indicator
. Voglio eseguire i metodi della classe Indicator (quelli della def self.subjects
varietà, degli ambiti, ecc.) Su questo array. L'unico modo che conosco per eseguire metodi di classe su un gruppo di oggetti è di averli come ActiveRecord :: Relation. Quindi finisco per ricorrere all'aggiunta di un to_indicators
metodo a Array
.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
A volte incateno alcuni di questi ambiti per filtrare i risultati, all'interno dei metodi della classe. Quindi, anche se chiamo un metodo su ActiveRecord :: Relation, non so come accedere a quell'oggetto. Posso solo arrivare al contenuto attraverso all
. Ma all
è un array. Quindi devo convertire quell'array in ActiveRecord :: Relation. Ad esempio, questo fa parte di uno dei metodi:
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
Immagino che questo si conduca a due domande.
- Come posso convertire un array di oggetti in un ActiveRecord :: Relation? Preferibilmente senza fare una
where
ogni volta. - Quando si esegue un
def self.subjects
metodo di tipo su un ActiveRecord :: Relation, come si accede all'oggetto ActiveRecord :: Relation stesso?
Grazie. Se ho bisogno di chiarire qualcosa, fammelo sapere.
.all
, usa semplicemente.scoped
come indica la risposta di Andrew Marshall (sebbene in rails 4 funzionerà con.all
). Se ti ritrovi a dover trasformare un array in una relazione, hai sbagliato da qualche parte ...