Представьте себе что-то вроде модели Пользователь, у которого много друзей, у каждого из которых много комментариев, где я пытаюсь показать пользователю последние 100 комментариев его друзей.
Можно ли вывести последние 100 в одном запросе SQL или мне придется использовать логику приложения Ruby для разбора большего списка или выполнения нескольких запросов?
Я вижу два способа сделать это:
- начиная с User.find и используя некоторую сложную комбинацию: join и: limit. Этот метод кажется многообещающим, но, к сожалению, он вернет мне пользователей, а не комментарии, и как только я получу их обратно, у меня будет много моделей, занимающих память (для каждого Друга и Пользователя), много ненужных полей, передаваемых (все для пользователя, и все о строке имени для друзей), и мне все равно придется каким-то образом пройтись, чтобы собрать и отсортировать все комментарии в логике приложения.
- начиная с Комментариев и используя что-то вроде find_by_sql, но я просто не могу понять, что мне нужно вставить. Я не знаю, как у вас могла бы быть необходимая информация для передачи с этим ограничиться только просмотром комментариев, сделанных друзьями.
Редактировать : Мне сложно заставить работать решение EmFi, и я был бы признателен за любые идеи, которые кто-либо может предоставить.
Друзья - это циклическая ассоциация через таблицу соединений.
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = #{Friendship::FULL}"
Это ошибка, которую я получаю в соответствующей части:
ОШИБКА: столбец users.user_id не существует
: SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments".user_id = "users".id WHERE (("users".user_id = 1) AND ((status = 2)))
Когда я просто ввожу user.friends, и он работает, это запрос, который он выполняет:
: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))
Так что, похоже, что у "до" есть два: сквозных в одном запросе.