ActiveRecord查询,按关联顺序,最后一个has_many

时间:2016-01-05 04:03:03

标签: sql ruby-on-rails ruby postgresql activerecord

我尝试按最近创建的相关评估(通信)的created_at列列出所有用户

到目前为止我所拥有的:

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

实际上,desc按预期工作。问题是当订单被撤销时我尝试订购asc。这似乎是因为用户可以有许多通信,查询按照创建的第一个通信的顺序返回用户的列表而不是最近的。

如何修改查询以定位ascdesc订单中最近创建的关联记录?

谢谢你的时间。

1 个答案:

答案 0 :(得分:7)

问题是您正在尝试按子的属性对父级进行排序,因此只有当他们的订单具有相同的方向时,您的解决方案才会起作用。

使用它的方法是使用子函数的聚合函数,如下所示:

# 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')