我想在我的rails应用中根据最近的文章和评论创建活动供稿。它们是两种不同类型的activerecord(它们的表结构不同)。
理想情况下,我可以创建一个混合的文章和评论数组,然后按相反的时间顺序显示它们。
所以,我可以弄清楚如何获取文章和评论的数组,然后将它们合并在一起并按created_at排序,但我很确定,一旦我开始使用分页,它将无法正常工作。
有没有办法创建一个像创建混合数组的范围?
对我来说,其他一个问题是它可能是所有文章,它可能是所有评论或两者之间的某种组合。所以我不能只说我将接受最后15篇文章和最后15篇评论。
关于如何解决这个问题的任何想法?
答案 0 :(得分:7)
当我done this before时,我通过使用非规范化的UserActivity
模型或类似的belongs_to
与ActivitySource
的多态关联来管理它 - 可以是任何您想要显示的内容类型(帖子,评论,投票,喜欢,等等......)。
然后,当创建要显示的任何实体时,您将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
等等。