Tengo una matriz de objetos, llamémoslo un Indicator
. Quiero ejecutar métodos de clase de indicador (los de la def self.subjects
variedad, 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_indicators
mé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 all
es 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
where
cada vez. - Al ejecutar un
def self.subjects
mé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.scoped
como 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 ...