Tengo una matriz de objetos, llamémoslo un Indicator. Quiero ejecutar métodos de clase de indicador (los de la def self.subjectsvariedad, alcances, etc.) en esta matriz. La única forma que conozco de ejecutar métodos de clase en un grupo de objetos es que sean un ActiveRecord :: Relation. Entonces termino recurriendo a agregar un to_indicatorsmétodo a Array.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
A veces encadeno bastantes de estos ámbitos para filtrar los resultados, dentro de los métodos de clase. Entonces, aunque llamo a un método en un ActiveRecord :: Relation, no sé cómo acceder a ese objeto. Solo puedo acceder a su contenido all. Pero alles una matriz. Entonces tengo que convertir esa matriz en un ActiveRecord :: Relation. Por ejemplo, esto es parte de uno de los métodos:
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
Supongo que esto se condensa en dos preguntas.
- ¿Cómo puedo convertir una matriz de objetos en un ActiveRecord :: Relation? Preferiblemente sin hacer una
wherecada vez. - Al ejecutar un
def self.subjectsmétodo de tipo en un ActiveRecord :: Relation, ¿cómo accedo a ese objeto ActiveRecord :: Relation?
Gracias. Si necesito aclarar algo, házmelo saber.
.all, simplemente use.scopedcomo indica la respuesta de Andrew Marshall (aunque en los rieles 4 funcionará.all). Si necesita convertir una matriz en una relación, se ha equivocado en algún lugar ...