我有一个对象数组,让我们称之为Indicator
。我想在这个数组上运行Indicator类方法(例如def self.subjects
、作用域等)。我所知道的唯一在一组对象上运行类方法的方式是将它们作为ActiveRecord::Relation。因此,我最终不得不添加to_indicators
方法到Array
中。
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
有时我会在类方法中链接多个这样的作用域来过滤结果。因此,即使我在ActiveRecord::Relation上调用一个方法,我也不知道如何访问该对象。我只能通过all
来获取其内容。但是,all
是一个数组。因此,我必须将该数组转换为ActiveRecord::Relation。例如,下面是其中一个方法的一部分:
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
我想这可以归结为两个问题:
- 如何将对象数组转换为ActiveRecord::Relation对象?最好不要每次都使用
where
方法。 - 当在ActiveRecord::Relation对象上运行类似
def self.subjects
的方法时,如何访问该对象本身?
谢谢。如果需要澄清任何事情,请告诉我。
.all
得到了它,那么就像 Andrew Marshall 的答案所示使用.scoped
(尽管在 Rails 4 中可以使用.all
)。如果你发现自己需要将数组转换为关系,说明你某些地方出错了... - nzifnab