relation one_to_one:获取非链接“belongs_to”实体的列表

时间:2013-03-20 11:49:33

标签: ruby-on-rails-3 activerecord orm one-to-many one-to-one

我有一个优化问题。我搜索如何使用ActiveRecord来请求获取one_to_one或one_to_many中没有任何链接的所有实体。

我有:

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

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

如果我想要所有model2s的列表非链接,我只需要做:

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

但我如何为model1s做同样的事情?我将列出所有未链接到model2的model1。

我尝试过很多东西,但是让它成功的唯一方法就是逐一提出所有要求,这太可怕了:

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

感谢您的帮助!

1 个答案:

答案 0 :(得分: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")

不确定这是语法上的(不能尝试代码:))是正确的,但希望这会让你知道如何完成任务。