将对象数组转换为 ActiveRecord::Relation

2024-06-26

我有一个对象数组,我们称其为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

我想这可以归结为两个问题。

  1. 如何将对象数组转换为 ActiveRecord::Relation?最好不做where每一次。
  2. 当运行一个def self.subjectsActiveRecord::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(使用前将#替换为@)

将对象数组转换为 ActiveRecord::Relation 的相关文章

随机推荐