假设我有两个模型Users
和Appointments
,其中用户 has_many 约会。
约会可以有两种不同的类型:typeA
和typeB
。
如何编写查询以按用户typeB
约会的数量对用户进行排序?
我查看了counter_cache,但似乎只计算了关联的数量(因此在这种情况下是用户可以拥有的约会数量)并且不允许计算特定类型的约会。
答案 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(',')})")