Как бы я сделал это JOIN в Rails? - PullRequest
0 голосов
/ 04 декабря 2009

Вот мой SQL-оператор:

SELECT * 
    FROM `message_users`
    LEFT JOIN `messages` ON message_users.message_id = messages.id
    WHERE (message_users.user_id = 1 AND message_users.hidden = 0)  AND message_users.last_read_at > messages.updated_at
    ORDER BY messages.updated_at DESC LIMIT 0, 20

Как бы я справился с правильными соединениями Rails / включает / что угодно?

1 Ответ

1 голос
/ 04 декабря 2009

Обычно вы не загружаете все данные из нескольких таблиц в одну модель в рельсах. Более распространенной является замена соединений ниже на include , которая будет предварительно загружать связанную модель, поэтому вы попадете в кеш при вызове message.message_users . Во всяком случае, это должно дублировать то, что делал ваш sql, если между именами столбцов messages и messages_users .

Если вам не нужны данные из messages_users после выполнения запроса, вы можете удалить фрагмент select .


  Message.find(:all, 
               :joins=>:message_users, 
               :select=>"message_users.*, messages.*",
               :conditions=>['message_users.user_id = ? and message_users.hidden = ? and message_users.last_read_at > messages.updated_at', 1,0],
               :order=>"messages.updated_at desc",
               :limit=>20)



Есть хороший скринкаст о разнице между объединениями и , включая здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...