オブジェクトの配列があり、これを と呼びますIndicator
。この配列で Indicator クラス メソッド (さまざまなメソッド、スコープ メソッドなど) を実行したいと思います。オブジェクトのグループでクラス メソッドを実行する唯一の方法は、それらを ActiveRecord::Relation にすることです。そのため、にメソッドdef self.subjects
を追加することになります。to_indicators
Array
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 つの質問に要約されると思います。
- オブジェクトの配列を ActiveRecord::Relation に変換するにはどうすればいいでしょうか? できれば毎回実行せずに
where
。 def self.subjects
ActiveRecord::Relation で type メソッドを実行する場合、その ActiveRecord::Relation オブジェクト自体にどのようにアクセスすればよいでしょうか?
ありがとうございます。何かご不明な点がありましたら、お知らせください。
ベストアンサー1
オブジェクトの配列arr
を ActiveRecord::Relation に変換するには、次のようにします (オブジェクトがどのクラスであるかを知っていると仮定します。おそらく知っているでしょう)
MyModel.where(id: arr.map(&:id))
ただし、これは使用する必要がありますwhere
。これは、使用をためらうべきではない便利なツールです。これで、配列をリレーションに変換するワンライナーができました。
使い方:
map(&:id)
オブジェクトの配列を、その ID のみを含む配列に変換します。配列を句に渡すと、次のようなwhere
SQL ステートメントが生成されます。IN
SELECT .... WHERE `my_models`.id IN (2, 3, 4, 6, ....
配列の順序は失われることに注意してください- しかし、あなたの目的はクラスメソッドを実行することだけなので、コレクションこれらのオブジェクトについては、問題はないと思います。