IM试图按最近创建的关联记录(通信)的created_at列列出所有用户。
到目前为止我所拥有的:

User.includes(:communications).order(
  'communications.created_at IS NULL, communications.created_at asc'
)

事实上,desc正如我所期望的那样工作。问题是当顺序颠倒时,我尝试顺序asc。这似乎是因为用户可以有许多通信,查询将按创建的第一个通信而不是最近的通信的顺序返回用户列表。
如何修改查询以将最近创建的关联记录同时指向ascdesc顺序?
谢谢你的时间。

最佳答案

问题是您正试图按子属性对父属性排序,因此您的解决方案只有在它们的顺序具有相同的方向时才有效。
使用它的方法是对子属性使用聚合函数,如下所示:

# ascending
User
  .joins('LEFT JOIN communications ON communications.user_id = users.id')
  .group('users.id')
  .order('MAX(communications.created_at) ASC')

# descending
User
  .joins('LEFT JOIN communications ON communications.user_id = users.id')
  .group('users.id')
  .order('MAX(communications.created_at) DESC')

07-25 23:52