0

最適化に関する質問があります。ActiveRecord を使用して、リンクを持たない one_to_one または one_to_many 内のすべてのエンティティを取得するリクエストを行う方法を検索します。

私は持っている:

class Model1 < ActiveRecord::Base
  has_one :model2
  ...

class Model2 < ActiveRecord::Base
  belongs_to :model1
  ...

すべてのモデル 2 の非リンクのリストが必要な場合は、次のようにするだけです。

unlinked_model2s = Model2.where(:model1_id => nil)

しかし、model1s に対して同じことを行うにはどうすればよいでしょうか? model2 にリンクされていないすべての model1 のリストが表示されます。

私は多くのことを試しましたが、それを機能させる唯一の方法は、すべてのリクエストを1つずつ行うことです。これは恐ろしいことです:

unlinked_model1s = Array.new
Model1.all.each do |model1|
  unless model1.model2
    unlinked_model1s << model1
  end
end

ご協力ありがとうございました!

4

1 に答える 1

0

これには、いくつかの SQL を記述する必要があります。デフォルトでは AR は のみinner joinをサポートしているため、 は使用できませんModel1.joins(:model2).where(...)

試すことができるようですModel1.joins("left join model2s on (model2s.model1_id = model1s.id) ").where(:model2s => {:id => nil})

また

Model1.joins("left join model2s on (model2s.model1_id = model1s.id) ").where("model2s.id is NULL")

これが構文的に正しいかどうかはわかりません (コードを試すことはできません :) ) が、これがタスクを達成する方法についてのアイデアを与えてくれることを願っています。

于 2013-03-20T12:00:13.863 に答える