【问题标题】:Creating a news feed in Rails 3在 Rails 3 中创建新闻提要
【发布时间】:2011-09-02 07:39:44
【问题描述】:

我想在我的 rails 应用程序中从最近的文章和 cmets 创建一个活动提要。它们是两种不同类型的activerecord(它们的表结构不同)。

理想情况下,我将能够创建文章和 cmets 的混合数组,然后按时间倒序显示它们。

所以,我可以弄清楚如何获取文章和 cmets 的数组,然后将它们合并在一起并按 created_at 排序,但我很确定一旦我开始使用分页,它就不会起作用。

有什么方法可以创建一个类似于创建混合数组的作用域?

对我来说,另一个问题是它可能是所有文章,也可能是所有 cmets 或两者之间的某种组合。所以我不能只说我会拿最后 15 篇文章和最后 15 篇 cmets。

关于如何解决这个问题的任何想法?

【问题讨论】:

标签: ruby-on-rails-3 activerecord


【解决方案1】:

当我拥有done this before 时,我已经通过使用非规范化的UserActivity 模型或与belongs_to 多态关联到ActivitySource 的类似模型来管理它 - 这可以是您想要的任何类型的内容显示(帖子、cmets、赞成票、点赞等等……)。

然后,当创建任何要显示的实体时,您将有一个 Observer 触发并在 UserActivity 表中创建一行,其中包含指向记录的链接。

然后要显示列表,您只需查询UserActivitycreated_at 降序排序,然后通过多态activity_source 关联导航以获取内容数据。然后,您需要在视图模板中使用一些智能来呈现 cmets 和帖子以及其他任何不同的内容。

例如类似...

user_activity.rb:

class UserActivity < ActiveRecord::Base
  belongs_to :activity_source, :polymorphic => true

  # awesomeness continues here...
end

comment.rb (post/whatever)

class Comment < ActiveRecord::Base
  # comment awesomeness here...
end

activity_source_observer.rb

class ActivitySourceObserver < ActiveRecord::Observer

  observe :comment, :post

  def after_create(activity_source)
    UserActivity.create!(
      :user => activity_source.user, 
      :activity_source_id => activity_source.id, 
      :activity_source_type => activity_source.class.to_s, 
      :created_at => activity_source.created_at, 
      :updated_at => activity_source.updated_at)
  end

  def before_destroy(activity_source)
    UserActivity.destroy_all(:activity_source_id => activity_source.id)
  end

end

【讨论】:

  • 这样做的一个问题是,当模型被销毁时,您正在销毁其关联的活动,而不是为销毁创建活动。想象一下 github 之类的活动提要;当您创建存储库时,它会发布到您的提要中。当您删除存储库时,您的提要会显示您删除了存储库。
  • @bratsche 我觉得这是一个边缘案例。就我的目的而言,这是一个天生凌乱/复杂的事情,如果有人删除了一条记录,我实际上确实希望删除提要项目。
【解决方案2】:

看看this railscast。

然后你可以对 15 篇文章进行分页,在 app/views/articles/index 中你可以这样做:

 - @articles.each do |article|
   %tr
     %td= article.body
   %tr
     %td= nested_comments article.comment.descendants.arrange(:order => :created_at, :limit => 15)

这假定以下关系:

 #app/models/article.rb
 has_one :comment # dummy root comment

 #app/models/comment.rb
 belongs_to :article
 has_ancestry

你在一篇文章中添加 cmets 如下:

 root_comment = @article.build_comment
 root_comment.save
 new_comment = root_comment.children.new
 # add reply to new_comment
 new_reply = new_comment.children.new

等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多