我有一个优化问题。我搜索如何使用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
感谢您的帮助!
答案 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")
不确定这是语法上的(不能尝试代码:))是正确的,但希望这会让你知道如何完成任务。