使用循环创建类似 Twitter 的时间轴,rails

Creating a Twitter-like timeline using loops, rails

目前我有可以关注艺术家的粉丝。现在想显示粉丝关注的艺人的艺人微博

我想按created_at创建艺术家的微博进行排序。

<% @fan.artists.each do |artist| %>
  <% artist.artist_microposts.sort_by{ |micropost| micropost.created_at }.each do |micropost| %>
   <%= micropost.content %>
  <% end %>
<% end %>

created_at排序,但由于是先循环每个艺术家,所以会显示属于一个艺术家的所有微博,然后显示属于下一个艺术家的所有微博,依此类推。

我希望它更像是一个时间轴,就像 Twitter,在微博进来时显示它们。

这不是您实现此功能的方式。如果你想在新推文到达时更新时间线,那么你需要使用 Jquery 来监听变化。观看这个 [http://railscasts.com/episodes/229-polling-for-changes][1] 它将向您展示如何实现您正在寻找的功能。

提示:不要按 created_at 排序,这是一种不好的做法,因为 create_at 不是索引,而且会更慢。而是按 id 排序,它是自动递增和索引的。

artist.artist_microposts.order('id DESC')

我能够通过首先获取 艺术家 ID 然后选择与这些艺术家关联的帖子来解决。

irb(main):019:0> fan = Fan.first
#<Fan id: 1, name: "Tony">

irb(main):020:0> ids = fan.artists.pluck(:id)
#=> [1, 2]

irb(main):022:0> posts = Post.where(:artist_id => ids).order("created_at DESC")
#=> #<ActiveRecord::Relation [
 #<Post id: 3, text: "Third Post", artist_id: 1, created_at: "2015-02-10 12:54:32">, 
 #<Post id: 2, text: "Second Post", artist_id: 2, created_at: "2015-02-09 12:53:14">, 
 #<Post id: 1, text: "First Post", artist_id: 1, created_at: "2015-02-08 12:52:51">  ]>

我能够通过在 fansartistsartist_microposts 之间创建连接 table 来完成此操作。然后我做了

<% @fan.artist_microposts.sort_by{ |micropost| micropost.id }.each do |micropost| %>
   <%= micropost.content %>
<% end %>

工作完美。