我有团体,团体有很多帖子.帖子有很多post_likes,post_comments和post_attachments.我正在建立一个群组帖子,我想根据活动对帖子进行排序.因此,对于给定的一组帖子,我想根据创建帖子的时间以及最近喜欢的帖子,评论或添加了附件的时间顺序显示DESC时间顺序的帖子.
以下是组模型中的“feed”方法:
def feed
Post.unscoped.includes([:post_likes, :post_comments, :post_attachments]).
joins("LEFT JOIN post_likes ON post_likes.post_id = posts.id").
joins("LEFT JOIN post_comments ON post_comments.post_id = posts.id").
joins("LEFT JOIN post_attachments ON post_attachments.post_id = posts.id").
where("posts.group_id = ?", id).group("posts.id").order('MAX(GREATEST("posts"."created_at", "post_likes"."created_at", "post_comments"."created_at", "post_attachments"."created_at")) DESC')
end
我正在加入post_likes,post_comments和post_attachments,以便我可以访问他们的created_at日期进行排序.我通过posts.id进行分组并添加MAX,这样我就可以获得最新的活动,而不会有任何重复的帖子.这工作得很好,但后来升级到Rails 4.2,现在我收到了这个弃用警告:
DEPRECATION WARNING: Modifying already cached Relation. The cache will be reset. Use a cloned Relation to prevent this warning
在我试图压制该警告时,它归结为从查询中删除MAX声明和组(“posts.id”).现在的问题是我在返回的结果中收到重复的帖子,因为有时帖子有多个喜欢或评论或附件.这导致了问题.
有什么想法吗?有没有更好的方法来获取我追求的数据?
最佳答案 这是一个已知的squeel gem问题:
https://github.com/activerecord-hackery/squeel/issues/374
只需猴子修补项目中的gem(例如将它放在config / initializers中):
module Squeel
module Adapters
module ActiveRecord
module RelationExtensions
def execute_grouped_calculation(operation, column_name, distinct)
super
end
end
end
end
end