2013-09-14 5 views
8

Я использую Rails 3 с ActiveRecord, и я не могу заставить его генерировать запрос, который я хочу, без вставки в него почти простого SQL.ActiveRecord left external join with and clause

Я просто хочу выполнить этот SQL-запрос (на самом деле запрос немного сложнее, но это действительно эта часть, которую я не могу получить).

SELECT DISTINCT users.*, possible_dates.* 
FROM users 
LEFT OUTER JOIN possible_dates 
ON possible_dates.user_id = users.id 
AND possible_dates.event_id = MY_EVENT_ID; 

, который мне удалось с помощью

User.includes(:possible_dates) 
    .joins("LEFT OUTER JOIN possible_dates 
      ON possible_dates.user_id = users.id 
      AND possible_dates.event_id = #{ActiveRecord::Base.sanitize(self.id)}" 
    ) 
    .uniq 

, но я чувствую, что я пропускаю что-то, чтобы просто добавить AND состояние LEFT JOIN с помощью методов запроса ActiveRecord. я также пытался сделать что-то вроде этого

User.includes(:possible_dates) 
    .where('possible_dates.event_id' => self.id) 
    .uniq 

но это дает (как и ожидалось), запрос с пунктом WHERE в конце и не п AND я хочу на объединение.

Кстати, self в двух фрагментах, приведенных выше, является экземпляром моего класса Event.

Благодарим за помощь.

+0

Можете ли вы дать попытку слияния? Добавьте '.merge (Возможные_данные.это ('possible_dates.event_id' => self.id))' – steakchaser

+0

Спасибо за комментарий. Я просто попытался, и это дает точно такой же запрос, что и мой последний пример, используя '.where ('possible_dates.event_id' => self.id)'. –

+0

Что-то вроде: User.includes (: possible_dates) .where ('possible_dates.event_id =? AND possible_dates.user_id =?', My_event_id, self.id) .uniq – stytown

ответ

4

(1 год спустя ...) Осмотревшись, я узнал, что лучше всего использовать таблицы isl. Для приведенного выше примера будет работать следующий код.

1 в eq(1) следует заменить правильным идентификатором события.