我有一个对象数组,我们称其为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
. But 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
每一次。
- 当运行一个
def self.subjects
ActiveRecord::Relation 上的 type 方法,如何访问 ActiveRecord::Relation 对象本身?
谢谢。如果我需要澄清任何事情,请告诉我。
您可以转换对象数组arr
像这样的 ActiveRecord::Relation (假设您知道对象是哪个类,您可能会这样做)
MyModel.where(id: arr.map(&:id))
你必须使用where
不过,它是一个有用的工具,您不应该不愿意使用。现在您有了将数组转换为关系的单行代码。
怎么运行的:
map(&:id)
会将对象数组转换为仅包含其 id 的数组。并将数组传递给where
子句将生成一个 SQLIN
看起来像这样的声明:
SELECT .... WHERE `my_models`.id IN (2, 3, 4, 6, ....
请记住,数组的顺序将会丢失- 但是由于您的目标只是在收藏对于这些对象,我认为这不会成为问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)