オブジェクトの配列をActiveRecord::Relationに変換する 質問する

オブジェクトの配列をActiveRecord::Relationに変換する 質問する

オブジェクトの配列があり、これを と呼びますIndicator。この配列で Indicator クラス メソッド (さまざまなメソッド、スコープ メソッドなど) を実行したいと思います。オブジェクトのグループでクラス メソッドを実行する唯一の方法は、それらを ActiveRecord::Relation にすることです。そのため、にメソッドdef self.subjectsを追加することになります。to_indicatorsArray

def to_indicators
  # TODO: Make this less terrible.
  Indicator.where id: self.pluck(:id)
end

時々、クラス メソッド内で、これらのスコープをかなり連鎖させて結果を絞り込むことがあります。そのため、ActiveRecord::Relation のメソッドを呼び出しても、そのオブジェクトにアクセスする方法がわかりません。 を通じてのみ、そのコンテンツにアクセスできます。allただし、allは配列です。そのため、その配列を ActiveRecord::Relation に変換する必要があります。たとえば、これはメソッドの 1 つの一部です。

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

これは 2 つの質問に要約されると思います。

  1. オブジェクトの配列を ActiveRecord::Relation に変換するにはどうすればいいでしょうか? できれば毎回実行せずにwhere
  2. def self.subjectsActiveRecord::Relation で type メソッドを実行する場合、その ActiveRecord::Relation オブジェクト自体にどのようにアクセスすればよいでしょうか?

ありがとうございます。何かご不明な点がありましたら、お知らせください。

ベストアンサー1

オブジェクトの配列arrを ActiveRecord::Relation に変換するには、次のようにします (オブジェクトがどのクラスであるかを知っていると仮定します。おそらく知っているでしょう)

MyModel.where(id: arr.map(&:id))

ただし、これは使用する必要がありますwhere。これは、使用をためらうべきではない便利なツールです。これで、配列をリレーションに変換するワンライナーができました。

使い方:

map(&:id)オブジェクトの配列を、その ID のみを含む配列に変換します。配列を句に渡すと、次のようなwhereSQL ステートメントが生成されます。IN

SELECT .... WHERE `my_models`.id IN (2, 3, 4, 6, ....

配列の順序は失われることに注意してください- しかし、あなたの目的はクラスメソッドを実行することだけなので、コレクションこれらのオブジェクトについては、問題はないと思います。

おすすめ記事