按日期排序的用户的两个模型关联

时间:2014-10-14 13:26:17

标签: ruby-on-rails

我有一位可以发布主题并留下评论的用户。我有他们的默认作用域按日期返回。

我想做的事情是我按日期一起显示所有用户主题和评论

示例:

  • topic 10/4
  • topic 10/2
  • 评论10/3
  • 评论10/1

会变成:

  • topic 10/4
  • 评论10/3
  • topic 10/2
  • 评论10/1

最好的方法是什么?除了:

@variable = user.comments + user.topics
@variable.sort_by &:created_at    
@variable.reverse!

2 个答案:

答案 0 :(得分:0)

我在这里看到两种选择。一种是编写纯SQL,这看起来比你的“三线解决方案”更难看。另一个是创建一个新的AR模型,比如

class UserForumActivities < ActiveRecord::Base
   self.table_name='user_forum_activities' # this is a name of psql view
end

视图可能看起来像

class CreateSomeView < ActiveRecord::Migration
 def self.up
    execute %q{
    CREATE OR REPLACE VIEW user_forum_activities AS
    SELECT "comments.desired_fields", "topics.desired_fields"
    FROM "comments", "topics"
    INNER JOIN "users" ON "foreign_keys"
    WHERE "appriopriate conditions if needed"
    ORDER BY created_at;
    }
  end
end

然后在你的控制器中,你可以使用它:

@variable = UserForumActivities.scoped_to_user_with_id(user.id)

所以,我们得到一行而不是三行你让你的数据库为你处理逻辑(db通常比Ruby快)。希望有所帮助,如果有人分享更好的解决方案,我也很好奇: - )

答案 1 :(得分:0)

这可以像活动流一样解决。您可以创建一个名为activity的独立模型,并与其他实体建立关系。当用户执行某些操作时,例如添加新评论或新主题,它也应该保存在活动中。 Activity应具有这些模型的外键(主题,注释,...),以便稍后获取它们。最后,您只需要对活动进行排序并加载对象(主题,评论,...)和显示。

有一个很好的教程如何做到这一点,但遗憾的是它不是免费的:http://railscasts.com/episodes/407-activity-feed-from-scratch

还有一个很好的gem public_activity可以解决问题。有一个教程如何(免费):http://railscasts.com/episodes/406-public-activity?view=asciicast