Как бы я сделал это JOIN в Rails?

0

Здесь мой оператор 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/includes/whatever?

Теги:

1 ответ

1
Лучший ответ

Обычно вы не загружаете все данные из нескольких таблиц в одну модель в рельсах. Более распространенным является замена соединений ниже с помощью include, который предварительно загрузит связанную модель, чтобы вы попали в кеш при вызове message.message_users. Во всяком случае, это должно дублировать то, что делал ваш sql, если не существует столкновений имен столбцов между сообщениями и 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)



Там хороший скринкаст о различии между соединениями и включает здесь

  • 0
    Спасибо! Работает отлично, и я ценю дополнительную информацию.
  • 0
    Нет проблем - подумал я, я бы просто оставил это как: join, если вам действительно не нужен доступ к данным message_users после запроса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню