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