我正在建立一个推特克隆并构建我需要的时间线,以便当前用户随后发布所有微博。
Railstutorial.org implements it like this:
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关联?
此外,对于此任务,哪种方法通常会更快 - 子选择或连接?
答案 0 :(得分:0)
试试这个:
class User
has_many :posts
has_many :follower_links, :class_name => "Follow", :foreign_key => :followee_id
has_many :followers, :through => :follower_links, :source => follower
has_many :followee_links, :class_name => "Follow", :foreign_key => :follower_id
has_many :followees, :through => :followee_links, :source => followee
def followee_posts
Post.joins("JOIN (#{followees.to_sql}) AS followees
ON posts.user_id = followees.id")
end
end
class Follow
belongs_to :followee, :class_name => "User"
belongs_to :follower, :class_name => "User"
end
class Post
belongs_to :user
end