我有一位可以发布主题并留下评论的用户。我有他们的默认作用域按日期返回。
我想做的事情是我按日期一起显示所有用户主题和评论
示例:
会变成:
最好的方法是什么?除了:
@variable = user.comments + user.topics
@variable.sort_by &:created_at
@variable.reverse!
答案 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