1. ホーム
  2. ruby-on-rails

[解決済み] オブジェクトの配列をActiveRecord::Relationに変換する

2022-10-07 04:26:18

質問

オブジェクトの配列があります。 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

これは2つの質問に凝縮されていると思います。

  1. オブジェクトの配列をActiveRecord::Relationに変換するにはどうすればよいですか? できれば where を毎回行わないでください。
  2. を実行すると def self.subjects 型のメソッドを実行する場合、そのActiveRecord::Relationオブジェクト自体にどのようにアクセスすればよいですか。

ありがとうございます。何か明らかにしなければならないことがあれば、教えてください。

どのように解決するのですか?

<ブロッククオート

オブジェクトの配列をActiveRecord::Relationに変換するにはどうすればよいですか?できれば、毎回whereを実行しないでください。

Relationは単なるSQLクエリのビルダーであり、そのメソッドは実際のデータには作用しないため、ArrayをActiveRecord::Relationに変換することはできません。

しかし、もしあなたが欲しいものがリレーションであるならば

  • は、ActiveRecord 3.xでは all を呼び出さず、代わりに scoped と同じレコードを表す Relation を返します。 all と同じレコードを表すRelationを返します。

  • ActiveRecord 4.xの場合、単純に all を呼び出すだけで、Relationが返されます。

を実行するとき def self.subjects 型のメソッドを実行する場合、そのActiveRecord::Relationオブジェクト自体にどのようにアクセスすればよいですか?

メソッドがRelationオブジェクト上で呼び出された場合。 self はリレーションです(定義されているモデルクラスとは対照的です)。