1

在这个问题中,我有两个数据库表:

  • 发布(has_many :comments)
  • ActivityFeed (belongs_to item, :polymorphic)
  • 评论 (belongs_to :post)

假设在 facebook 的一个组内发生了以下顺序动作:

  1. 用户 A 发布了状态“状态 1”
  2. 用户 B 发布了状态“状态 2”

然后这两个帖子中的每一个都触发了该组的 FeedItem (Activity) 的创建。

现在,当用户加载页面时,提要活动按 created_at/updated_at 排序。提要活动是一组多态的对象(可以是帖子、照片、投票、文件...)。

如果稍后用户 A 评论了用户 B 的帖子,则提要的正确顺序现在应该是:

  1. “状态 2”
  2. “状态 1”

那么当用户 A 评论“状态 2”时会发生什么?我是否必须找到相关的帖子(添加评论的位置)并更新与帖子相关的活动的时间戳?

我需要一些建议。谢谢!


更新

class Comment < ActiveRecord:Base
  belongs_to :post, touch: true
end

class Post < ActiveRecord:Base
  has_many :comments
  act_as_activity -> on_create will create a Activity representing this object
end

class Activity < ActiveRecord:Base
  belongs_to :item, :polymorphic => true
  belongs_to :parent, :polymorphic => true
  belongs_to :user
end

因此,提要查询将查找活动表,因为提要中可以有多种类型的对象。并且在评论帖子时必须刷新此表中的时间戳,因为查询是在 Activity 表中完成的:

SELECT * FROM Activity 
              ORDER BY updated_at
4

2 回答 2

2

如果我理解正确,帖子应该以“最近”的顺序显示。在帖子上添加评论应该刷新“最近”时间。

Here's something to try. There's a options for an belongs_to association called :touch. By adding this option, the addition of a Comment on a Post should cause the updated_at field on the Post to be updated whenever a Comment is added (or deleted) from the association.

http://guides.rubyonrails.org/association_basics.html

For example:

class Comment < ActiveRecord:Base
  belongs_to :post, touch: true
end

class Post < ActiveRecord:Base
  has_many :comments
end

then you do your sort on the Post instance's :updated_at field.

于 2013-01-18T14:00:44.630 回答
1

Using bdares' idea of using an after_create callback it might look something like this.

class Comment
  belongs_to :post, touch: true
  after_create do 
     self.post.activity.last_update_at = Time.now
     self.post.activity.save!
  end
end

This means that you're sorting Activity by that last_update_at field.

于 2013-01-18T16:56:17.000 回答