Rails 3.2, Twitter app
更新:想说我正在寻求随机化我的推文。发现@instace.shuffle.each
做得很好。
现在我可以像这样显示所有状态,
users_controller.rb
def buddies
buddies_ids = current_user.followeds.map(&:id).push(current_user.id)
@ribbits = Ribbit.find_all_by_user_id buddies_ids
/views/users/buddies.html.erb
<% @ribbits.each do |ribbit| %>
<h3><%= ribbit.user.username %></h3>
<%= ribbit %>
你明白了。虽然我不确定find_all_by_user_id
来自哪里,但我只想显示每个关注用户的最新状态。
我把魔术词放在哪里?
您还应该能够在一行中完成此操作:
@ribbits = Ribbit.where('user_id IN (?)', buddies_ids).order('created_at DESC').group(:user_id)
然后,您可以像以前一样执行每个循环访问并显示每个状态。
Ribbit.find_all_by_user_id
是由Rails动态创建的方法。在此 RailsCast 中查看有关动态find_by方法的更多信息。
就像find_all_by_user_id
是一种动态轨道方法一样,find_by_user_id
也是如此,它只会找到第一个。要找到最新的"ribbit",您需要编写
@latest_ribbit = Ribbit.find_by_user_id(user_id, :order => 'created_at DESC')
编辑:我应该对此进行一点扩展。 find_all_by_user_id
将接受user_id
值数组(例如buddies ids
),就像任何其他动态find_all_by...
方法一样。 find_by_user_id
也将接受user_ids数组,但它只会返回数组中每个user_id的第一个合格项。因此,如果您想要一个即插即用的示例,请将您的@ribbits =
行替换为
@ribbits = []
buddies_ids.each do |id|
@ribbits << Ribbit.find_by_user_id(user_id, :order => 'created_at DESC')
end
然后,如果您想要按时间顺序排列的提要,则需要根据created_at@ribbits进行一些排序,因为它将按代码末尾的buddies_ids顺序排列。