我正在使用rails 4进行Twitter克隆练习。当用户登录时,在时间线上我只想显示他们关注的人(朋友)和他们自己的推文的推文,以DESC顺序。我使用tweets #index作为我的时间表。目前,我正在向用户显示数据库中的所有推文:
def index
@tweets = Tweet.all.order("created_at DESC")
end
我添加了一个名为@user_friendships的实例变量,其中包含当前登录的用户朋友,然后我可以迭代并访问他们的推文。现在看来是这样的:
def index
@user_friendships = current_user.user_friendships.all
@tweets = Tweet.all.order("created_at DESC")
end
我不想循环访问user_friendship并抓住它的朋友,然后在视图中发推文,并循环播放current_users推文。
在控制器中,我希望有一个实例变量包含current_user和user_friendships中每个朋友推文的推文...所以在视图中我只需要遍历新数组。
型号代码
### User.rb
has_many :tweets
has_many :user_friendships
has_many :friends, through: :user_friendships
acts_as_voter
def to_param
username
end
### user_friendship.rb
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'
### tweet.rb
belongs_to :user
答案 0 :(得分:1)
您没有显示tweets
和users
之间的关系,但我认为您的用户有很多推文。然后,你可以这样做:
@tweets = Tweet.where(user_id: [current_user.id].concat(current_user.user_friendships.all.map(&:id)))
答案 1 :(得分:1)
def index
@tweets = current_user.related_tweets.sort_by{|t| t.created_at}.reverse!
end
模型用户中的
class User < ActiveRecord::Base
# ...
def related_tweets
friends_tweets = friends.map{|f| f.tweets}
return (tweets.to_a + friends_tweets).flatten
end
# ...
end
或其他解决方案,如果您不想使用数组
def index
@tweets = Tweet.for_user(current_user).order(cretead_at: :desc)
end
模型推文中的
class Tweet < ActiveRecord::Base
# ...
def self.for_user user
me_and_friends = [user.id] + user.friends.map(&:id)
where(:user_id => me_and_friends)
end
# ...
end
答案 2 :(得分:0)
您可以这样做:
def index
@tweet_wall = Tweet.all.where(user_id: current_user.id).where(relationship between user and friend)
end
第二个条件取决于你的模型。