2013-03-20 20 views
0

我有一個優化問題。我搜索如何使用ActiveRecord來請求獲取one_to_one或one_to_many中沒有任何鏈接的所有實體。關係one_to_one:獲取非鏈接「belongs_to」實體的列表

我:

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

這需要編寫一些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")

不知道這是語法上(不能試穿的代碼:))是正確的,但希望這會在給你的想法如何完成你的任務。

+0

謝謝你的回答! Model1.joins(「LEFT JOIN model2s ON(model2s.model1_id = model1s.id)」)。其中(:model2s => {:model1_id => nil})完美地工作!非常感謝你 – Polopollo 2013-03-20 12:13:42