Eu tenho uma série de objetos, vamos chamá-la de Indicator
. Eu quero executar métodos de classe Indicator (aqueles da def self.subjects
variedade, escopos, etc) neste array. A única maneira que conheço de executar métodos de classe em um grupo de objetos é fazer com que sejam um ActiveRecord :: Relation. Então acabo recorrendo à adição de um to_indicators
método a Array
.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Às vezes, eu encadeamento alguns desses escopos para filtrar os resultados, dentro dos métodos de classe. Portanto, embora eu chame um método em um ActiveRecord :: Relation, não sei como acessar esse objeto. Eu só consigo acessar o conteúdo dela all
. Mas all
é um Array. Então, eu tenho que converter esse array para um ActiveRecord :: Relation. Por exemplo, isso faz parte de um dos 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
Acho que isso se resume a duas perguntas.
- Como posso converter um Array de objetos em um ActiveRecord :: Relation? De preferência sem fazer um a
where
cada vez. - Ao executar um
def self.subjects
método de tipo em um ActiveRecord :: Relation, como faço para acessar o próprio objeto ActiveRecord :: Relation?
Obrigado. Se eu precisar esclarecer alguma coisa, me avise.
.all
, apenas use.scoped
como indica a resposta de Andrew Marshall (embora no rails 4 funcione com.all
). Se você precisar transformar um array em uma relação, você errou em algum lugar ...