2013-03-20 2 views
0

У меня вопрос оптимизации. Я ищу, как использовать ActiveRecord для выполнения запроса для получения всех объектов в one_to_one или one_to_many, у которых нет ссылки.отношение one_to_one: получить список несвязанных объектов "принадлежит_to"

у меня есть:

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

и

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

Если я хочу список всех model2s без ссылок, я просто должен сделать:

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

Но как я сделать то же самое для model1s? У меня будет список всех моделей1, которые не связаны с моделью2.

Я пробовал много вещей, но единственный способ сделать это работает, это на все запросы один за другим, что попало:

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

Смежные вопросы