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