【问题标题】:How to sort items from a newsfeed as last_active_at?如何将新闻源中的项目排序为 last_active_at?
【发布时间】:2013-01-18 12:47:31
【问题描述】:

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

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

假设在 facebook 的一个群组中发生了这些连续的动作:

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

然后这 2 个帖子中的每一个都触发了为组创建 FeedItem(活动)。

现在,当用户加载页面时,Feed 活动按 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

【问题讨论】:

    标签: ruby-on-rails postgresql database-design social-networking feed


    【解决方案1】:

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

    这里有一些东西可以尝试。有一个名为 :touch 的 belongs_to 关联选项。通过添加此选项,在帖子上添加评论应该会导致在关联中添加(或删除)评论时更新帖子上的 updated_at 字段。

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

    例如:

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

    然后您对 Post 实例的 :updated_at 字段进行排序。

    【讨论】:

    • :touch 选项的存在很棒。我的第一个想法是在Comment 上添加一个after_create 挂钩,但该功能是内置的!
    • 感谢您的回答。手感不错!您的回答没有错,但查询不在 Posts 表中,因为我可以有多个对象类型。请参阅我的编辑。谢谢!
    • 根据您的更新,您如何从帖子中引用活动。 Post 上是否有 has_one :activityhas_many :activity
    • @GSP with has_one :activity
    • @GSP 我看到的是:对帖子的评论会触及帖子,这应该触及活动。不过不知道,好像不对。。不过我没有别的想法
    【解决方案2】:

    使用 bdares 的使用 after_create 回调的想法可能看起来像这样。

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

    这意味着您正在按 last_update_at 字段对 Activity 进行排序。

    【讨论】:

    • 我的想法与此非常相似。我唯一关心的是性能操作系统写入。但我应该认为以后会有所改善。谢谢
    猜你喜欢
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2012-04-08
    相关资源
    最近更新 更多