按注释排序时的范围主题查询
我正在尝试按最近的评论设置主题索引的顺序。 这是有效的:
Topic.joins(:comments).order("comments.created_at desc")
但它不止一次列出了主题。
有没有办法将每个主题的显示时间限制为一个?
好的,正在发生的事情是:当您加入评论时,每个评论会得到一个数据库行(如果主题上有多个评论),则表示每个主题记录的多个副本。
要解决此问题,您需要使用分组,以便每个主题只有一个结果。 分组的东西是你要返回的模型的id( topics.id
)。 现在,还有更多内容 – 因为每个结果仍然有多个注释,每个结果也有多个created_at值,因此(为了按照它进行排序),您需要告诉数据库使用哪个。
这是通过某种聚合函数完成的。 我猜你最近的评论是决定订单的评论。 如果这是真的,代码将是这样的:
Topic.joins(:comments).select('topics.*, max(comments.created_at) as last_comment').group('topics.id').order('last_comment desc')
自定义选择包括您需要的常用数据(关于主题对象的所有内容 – topics.*
)以及在创建日期使用的聚合函数( max()
,顾名思义返回可能的最大值。)的评论。 更新的日期更大,因此这将是最新评论的创建日期戳。 该结果的别名为last_comment
(使用as
),因此您可以在.order
调用中引用它。
我发现解决问题的最优雅的方法是在注释模型中添加touch
多态关联:
belongs_to :commentable, :polymorphic => true, touch: true
如果您没有使用多态关联,则可以使用:
belongs_to :topic, touch: true
然后,我所要做的就是将主题模型中的默认范围更改为updated_at
default_scope order: 'topics.updated_at DESC'
添加注释touch
意味着每次向主题添加注释时,它都会更新主题中的updated_at列。
在我使用的控制器中:
@topics = Topic.order(sort_column + " " + sort_direction).paginate(:per_page => 20, :page => params[:page])
Topic.all
或其他东西也可以在那里工作。
感谢我的超级朋友阿兰向我指出这一点。
- 在使用Action Cable(Puma端口侦听)的同时将Ruby on Rails应用程序部署到Heroku
- Gitlab拒绝创建远程存储库
- Heroku推被拒绝,铁路依赖冲突? Ruby on Rails教程第1.4.2节
- Rails:瘦控制器与胖模型,或者我应该让我的控制器厌食?
- 管理Rails应用程序配置设置的最佳方法是否仍存在于数据库中?
- 安装“nio4r”时使用rails 5.0.0:无法构建gem原生扩展
- 什么原因导致在ruby中构建公钥时“PUB键和PRIV键都没有嵌套asn1错误”?
- heroku / memcache和dalli的奇怪缓存问题
- 无法使用Aptana Studio 3创建新的Rails项目