У меня есть модели foo, bar и baz вот так
# has a field join_condition_string
class Foo < AR::Base
:has_many :bar
end
# Has a field exclusion_critera
class Bar < AR::Base
:belongs_to foo
end
# has a fields condition_string, exclusion_criteria
class Baz < AR::Base
end
Я хочу иметь возможность извлекать Foo на основе критериев как из Bar, так и из Baz. Таким образом, мне нужно присоединиться к обеим моделям. Я хочу присоединиться к Бару, используя магию рельсов,
Foo.find(:all, :joins => :bar)
И я хочу присоединиться к Baz, используя пользовательское соединение.
Foo.find(:all, :joins=>"left join baz on baz.condition_string = foo.join_condition_string")
Независимо друг от друга они отлично работают, но я не могу найти способ элегантно их объединить.
Я пытался сделать наивную вещь и объединить два условия в массив, но безрезультатно.
Foo.find(:all, :joins=>["left join baz ...", :bar])
документы утверждают, что я могу сделать Foo.find(:all, :joins => :bar, :joins => "left join baz ...")
, но это не похоже как будто это должно работать (и не работает в rails 2.3.8), потому что аргументы, которые нужно найти, завернуты в хеш, а первый :joins потерян.
Конечно, я всегда мог объединить их в одну строку :joins. Однако как эти два вызова можно совместить с минимальным количеством необработанного sql? Любые идеи?
РЕДАКТИРОВАТЬ: Принятый ответ действительно отвечает на мой вопрос, но я все еще думаю, что может быть лучший способ.
РЕДАКТИРОВАТЬ 2: Как уже упоминалось, rubyprince, это было решено в rails >= 3.0.0
Foo.find(:all, :joins=>[:bar, "left join baz ..."])
? Я имею в виду массив в обратном порядке... - person rubyprince   schedule 07.04.2011