2013-03-20 1 views
0

최적화 질문이 있습니다. ActiveRecord를 사용하여 one_to_one 또는 one_to_many에 링크가없는 모든 엔티티를 가져 오는 요청을하는 방법을 검색합니다.relation 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) 

을하지만 어떻게 모델 1에도 똑같이 적용합니까? 나는 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