在Rails 3中创建新闻源

时间:2011-06-14 07:33:51

标签: ruby-on-rails-3 activerecord

我想在我的rails应用中根据最近的文章和评论创建活动供稿。它们是两种不同类型的activerecord(它们的表结构不同)。

理想情况下,我可以创建一个混合的文章和评论数组,然后按相反的时间顺序显示它们。

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

有没有办法创建一个像创建混合数组的范围?

对我来说,其他一个问题是它可能是所有文章,它可能是所有评论或两者之间的某种组合。所以我不能只说我将接受最后15篇文章和最后15篇评论。

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

2 个答案:

答案 0 :(得分:7)

当我done this before时,我通过使用非规范化的UserActivity模型或类似的belongs_toActivitySource的多态关联来管理它 - 可以是任何您想要显示的内容类型(帖子,评论,投票,喜欢,等等......)。

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

然后要显示列表,您只需按UserActivity降序created_at查询,然后浏览多态activity_source关联以获取内容数据。然后,您需要在视图模板中使用一些智能来呈现评论和帖子,以及其他不同的方式。

E.g。类似......

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

答案 1 :(得分:0)

看看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

您可以按如下方式在文章中添加评论:

 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

等等。