2012-08-09 1 views
2

В моем приложении Rails я хочу присоединиться к одной таблице с именованной областью другой таблицы. Есть ли способ сделать это, не переписывая именованную область в чистом SQL для моей инструкции соединения?Использование именных областей в качестве подзапросов в рельсах

В принципе, есть ли способ сделать что-то подобное?

class Foo < ActiveRecord::Base 
    scope :updated_today, where('updated_at > ?', DateTime.now.prev_day) 
end 

Bar.joins(Foo.updated_today) 

Где Bar.joins генерирует следующий SQL:

SELECT * FROM bars 
INNER JOIN 
    (SELECT * FROM foos WHERE updated_at > 2012-8-9) AS t0 
ON bar_id = bars.id 

ответ

1

Я не верю, что существует какой-либо метод, специально предназначенный для этого. Вы можете, однако, использовать метод to_sql из ActiveRecord::Relation, чтобы получить полный SQL-запрос для области в виде строки, которые затем можно использовать в качестве подзапроса в присоединиться заявление, например, так:

Bar.joins("INNER JOIN (#{Foo.updated_today.to_sql}) as t0 ON bar_id = bars.id") 
+0

Да, я просто ответил на свой вопрос. Если у кого-то есть лучший способ сделать это, пожалуйста, не стесняйтесь звонить. – Ajedi32

+1

Прекрасно подходит для ответа на ваш собственный вопрос, особенно когда остальные из нас не могут этого сделать ... :) – BaronVonBraun

2

Вы можете использовать метод merge присоединиться к области действия запроса другой модели:

Bar.joins(:foos).merge(Foo.updated_today) 

Я не видел тонны документации по этому поводу (у Rails API нет даже никакой документации по самому методу), но здесь довольно приличный blog post, дающий достаточно подробный пример.

Также заметили, что это упоминается в RailsCast на Advanced Queries in Rails 3.

+1

Это действительно интересно, но это не совсем то, что я искал. Я не хочу присоединяться к областям запроса, я хочу использовать запрос, сгенерированный областью, как подзапрос, который я могу назвать LEFT OUTER JOIN. (Я уточню вопрос, чтобы сделать это более понятным.) – Ajedi32

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