0

Rails 3.2,推特应用

更新:想说我正在寻找随机化我的推文。并且发现@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来自哪里,但我只想显示每个关注用户的最新状态。

我把魔法词放在哪里?

4

2 回答 2

0

Ribbit.find_all_by_user_id是 Rails 动态创建的方法。在这个 RailsCast 中查看更多关于动态 find_by 方法的内容。

很像find_all_by_user_idis 一个动态 rails 方法,所以 is 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 的顺序排列。

于 2013-11-04T22:07:39.767 回答
0

您还应该能够在一行中做到这一点:

@ribbits = Ribbit.where('user_id IN (?)', buddies_ids).order('created_at DESC').group(:user_id)

然后您可以像以前一样执行 each 来迭代并显示每个状态。

于 2013-11-04T22:36:35.613 回答