1

Rails 3 では、関連付けられたモデルに対してクエリを実行できます。

例 1:

model.associated_models.where(:attribute => 1)

associated_models はモデルの配列です。

手動で作成されたモデルの配列に対してアクティブレコードクエリを実行することは可能ですか?

例 2:

[Model.create!(attribute: 1), Model.create!(attribute: 2)].where(:attribute => 1)

最初の例の associated_models とモデルの配列と同じですが、associated_models を呼び出すときに舞台裏で何かが起こっていると思います。

この動作をシミュレートして、例 2 を機能させることはできますか?

4

2 に答える 2

1

短い答えはノーです。できません。Activerecord スコープ チェーンは db のクエリを構築します。これは、例のように AR オブジェクトの配列であっても、任意の配列に対して解釈することはできません。

適切なdbスコープのいずれかで「シミュレート」できます

Model.where(:id => array_of_ar_objects.map(&:id), :attribute => 1)

(ただし、必要な場合にのみ db 呼び出しを実行するため、これは間違っています)または配列検索を使用して:

array_of_ar_objects.select { |model| model.attribute == 1 }

また、model.associated_models は配列ではなく、ActiveRecord::Associations::HasManyAssociation一種の関連付けプロキシであることに注意してください。その「クラス」メソッドが強制されている配列に委譲されていても、それは非常にトリッキーな原因です。これが、あなたが誤解された理由だと思います。

model.associated_models.class == Array
-> true
于 2012-05-26T09:12:40.353 に答える
1

このタスクには、配列を ActiveRecord::Relation に絞り込むよりも、Array#keep_if をお勧めします。

 [Model.create!(attribute: 1), Model.create!(attribute: 2)].keep_if { |m| m.attribute == 1 }

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-keep_if (注、Array#select! も同じことを行いますが、後で読むときに混乱を避けるために keep_if を好みます、それはSQLの選択に関連している可能性があると考えています)

于 2012-05-26T08:55:14.740 に答える