gpt4 book ai didi

sql - 如何在 Rails 事件记录查询中执行条件计数?

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:16 25 4
gpt4 key购买 nike

在 Rails 3.2 应用程序中,我试图构建一个查询,该查询将返回一个包含两个计算计数的数组。该应用程序具有三种模型:一个用户有很多事件,一个位置有很多事件。我需要为用户返回一个数组,其中包含他们在每个位置的事件数以及事件事件数。

例如,[#<Location id: 1, name: "Location Name", total_events_count: 4, active_event_count: 4>]>

我可以得到 total_event_count

user = User.find(params[:id])
user.locations
.select("locations.id, locations.name, count(events.id) AS total_events_count")
.joins(:events)
.group("locations.id")

假设我的事件模型有一个字符串 status可以取值的字段 active ,如何在此查询中包含 active_events_count?

编辑

在 xdazz 和 mu 的一些有用建议之后,我仍在为此苦苦挣扎。我的问题似乎是计数计算的是所有事件,而不是属于位置和用户的事件。

我将尝试重新表述我的问题,希望有人能帮助我理解这一点。

事件同时属于用户和位置(即 User has_many :locations, through: :events)

事件有几个字段,包括status (字符串)和 participants (一个整数)。

在用户显示 View 中,我正在尝试生成用户位置列表。对于每个位置,我想显示一个“成功率”。成功率是用户与参与者的事件总数除以该用户的事件总数。即,如果用户 1 在位置 A 有 4 个事件,但其中只有两个事件有参与者,则用户 1 在位置 A 的成功率为 0.5(或 50%)。

我实现这一目标的方法是通过一个选择查询,该查询还包括 total_events_count 的计算计数。和 successful_events_count . (可能有更好的方法?)

所以我做了类似的事情:

user = User.find(params[:id])
user.locations
.select("locations.id, locations.name, count(events.id) AS total_events_count, sum(case events.marked when NOT 0 then 1 else 0 end) AS successful_events_count")
.joins(:events)
.group("locations.id")

这将返回一个包含正确键的数组,但值不正确。我正在获取该位置的所有事件(以及所有成功事件)的总数,而不仅仅是属于当前用户的那些事件的计数。

我一直在研究这个问题,以至于我自己都很困惑。非常感谢新的观点和想法!!

EDIT2

经过休息和重新审视后,我设法使用以下代码获得了我需要的结果。这似乎很复杂。如果有更好的方法,请告诉我。否则我会整理这个问题以防其他人遇到同样的问题。

class User
def location_ratings
events = self.events
successful_events = events.where('events.participants > 0')
user_events_by_location = Event.
select("events.location_id AS l_id, count(events.id) AS location_event_count").
where( id: events.pluck(:id) ).
group("l_id").
to_sql
user_successful_events_by_location = Event.
select("events.location_id AS l_id, count(events.id) AS location_successful_events_count").
where( id: successful_events.pluck(:id) ).
group("l_id").
to_sql
Location.
joins("JOIN (#{user_events_by_location}) AS user_events ON user_events.l_id = location.id").
joins("JOIN (#{user_successful_events_by_location}) AS successful_user_events ON successful_user_events.l_id = location.id").
select('location.id, location.name, user_events.location_events_count, successful_user_events.location_successful_events_count').
order("user_events.location_events_count DESC")
end

最佳答案

您可以使用 sum(events.marked='active') 来获取它:

user.locations
.select("locations.id, locations.name, count(events.id) AS total_events_count, sum(events.marked='active') AS marked_event_count")
.joins(:events)
.group("locations.id")

更新:

如果您使用的是 postgresql,那么在使用 SUM 函数之前,您必须将 boolean 大小写为 int。

user.locations
.select("locations.id, locations.name, count(events.id) AS total_events_count, sum((events.marked='active')::int) AS marked_event_count")
.joins(:events)
.group("locations.id")

关于sql - 如何在 Rails 事件记录查询中执行条件计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23234641/

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