Я создаю твиттер-клон и для построения временной шкалы мне нужно, чтобы все микросообщения были опубликованы кем-либо, за кем следует текущий пользователь.
Railstutorial.org реализует это следующим образом :
class Micropost < ActiveRecord::Base
default_scope :order => 'microposts.created_at DESC'
# Return microposts from the users being followed by the given user.
scope :from_users_followed_by, lambda { |user| followed_by(user) }
private
# Return an SQL condition for users followed by the given user.
# We include the user's own id as well.
def self.followed_by(user)
following_ids = %(SELECT followed_id FROM relationships
WHERE follower_id = :user_id)
where("user_id IN (#{following_ids}) OR user_id = :user_id",
{ :user_id => user })
end
end
Но я чувствую, что суб-выбор немного грязный, и я думаю, что предпочел бы сделать это с помощью объединений.Вот SQL-запрос, который мне нужен:
SELECT m.*
FROM Users u
INNER JOIN Follows f
ON u.id = f.follower_id
INNER JOIN Microposts m
ON s.user_id = f.followee_id
WHERE u.id = [current users id]
ORDER BY m.posted_at DESC
Как я могу перевести это в ассоциации ActiveRecord?
Кроме того, какой метод обычно будет быстрее для этой задачи - дополнительный выбор или объединение?