按模型与特定属性的关联计数

时间:2016-10-18 14:59:22

标签: ruby-on-rails ruby postgresql activerecord

假设我有两个模型UsersAppointments,其中用户 has_many 约会。

约会可以有两种不同的类型:typeAtypeB

如何编写查询以按用户typeB 约会的数量对用户进行排序?

我查看了counter_cache,但似乎只计算了关联的数量(因此在这种情况下是用户可以拥有的约会数量)并且不允许计算特定类型的约会。

2 个答案:

答案 0 :(得分:6)

使用joins(内部联接),您将只获得至少有一个约会关联的用户:

User.joins(:appointments)
    .where(appointments: { type: 'typeB' })
    .group('users.id')
    .order('count(appointments.id) DESC')

如果您使用includes(LEFT OUTER JOIN),您将获得列表末尾没有约会'typeB'的所有用户的列表。

答案 1 :(得分:2)

根据数据库的大小和复杂性,有时最好在表上执行两个查询而不是连接。如果您想跳过联接,一种方法是从一个选择查询中获取Ids的顺序,然后从第二个查询中检索记录。

ordered_user_ids = Appointments.select('user_id, count(1) AS N')
.where(:type => 'typeB').group(:user_id).order('N desc').collect(&:user_id)

# find users keeping the order of the users intact
User.find(ordered_user_ids, :order => "field(id, #{ordered_user_ids.join(',')})")