gpt4 book ai didi

sql - rails 4 复杂的 SQL 作用域

转载 作者:行者123 更新时间:2023-11-29 12:38:03 25 4
gpt4 key购买 nike

我有一个模型 Users,它 has_many EventLogs

我想创建一个范围,它将按照事件日志出现次数最多的用户对用户进行排序。

scope :highest_completed_events, .....

如何计算状态为 2 的事件日志的数量,然后对此类事件发生次数最多的用户进行排序。

User.joins(:event_logs).where("event_logs.status_id = 2")#... COUNT, then ORDER BY

希望这是有道理的。

最佳答案

下面是一个查询,您可以执行该查询来让您的用户按他们拥有的事件数排序:

@users = User.
select("users.*, COUNT(event_logs.id) as event_logs_count").
joins('LEFT JOIN event_logs ON event_logs.user_id = users.id').
group('users.id').
order('event_logs_count DESC')

您应该使用 LEFT JOIN,因为您需要包括没有任何事件的用户。

如果您将其写为范围:

scope(:highest_completed_events, {
select: 'users.*, COUNT(event_logs.id) as event_logs_count',
joins: 'LEFT JOIN event_logs ON event_logs.user_id = users.id',
group: 'users.id',
order: 'event_logs_count DESC'
})

@users = User.highest_completed_events

为了按特定状态过滤事件,只需使用 where()

@users = User.
select("users.*, COUNT(event_logs.id) as event_logs_count").
joins('LEFT JOIN event_logs ON event_logs.user_id = users.id').
where('event_logs.status = ?', STATUS_COMPLETE).
group('users.id').
order('event_logs_count DESC')

顺便说一句,在执行类似 @users.count 的操作时,有时您会遇到 ActiveRecord 剥离自定义 select() 语句的问题。我通常做的是将这种事情嵌套在自定义 from() 语句中。

_from = User.
select("users.*, COUNT(event_logs.id) as event_logs_count").
joins('LEFT JOIN event_logs ON event_logs.user_id = users.id').
group('users.id').
order('event_logs_count DESC').to_sql

@users = User.from("(#{_from}) as users")

@users.count # will work

关于sql - rails 4 复杂的 SQL 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19755196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com