【发布时间】:2025-11-28 19:00:01
【问题描述】:
我正在将手动 SQL 查询重写为 ActiveRecord 查询,以便在 Rails 应用程序中使用。
它的作用是从同一个表中收集两组用户:一组在上周进行了合格事件(44 或 48),一组用户在一个月前进行了相同的合格事件。
这是当前查询。我不知道如何把它变成一个 ActiveRecord 范围:
select top 500 active_users_last_week.email
from (
select distinct(email) from user_event_tracking
where event_id in (44,48)
and sitedb_created_date between getdate()-8 and getdate()-1
and sitedb_name = 'XYZ'
and email not like '%@company.com'
and email not like '%@other_company.com'
) active_users_last_week,
(
select distinct(email) from user_event_tracking
where event_id in (44,48)
and sitedb_created_date between getdate()-60 and getdate()-30
and sitedb_name = 'XYZ'
and email not like '%@company.com'
and email not like '%@other_company.com
) active_users_last_month
where active_users_last_week.email = active_users_last_month.email;
关于如何将其转换为 ActiveRecord 范围的任何建议?我已经将这些设置为范围:
scope :active_events, lambda {
where("event_id in (44,48)")
}
scope :for_property, lambda { |property|
where('sitedb_name = ?', property)
}
scope :last_week, lambda {
where("sitedb_created_date between GETDATE()-8 and GETDATE()-1")
}
scope :last_month, lambda {
where("sitedb_created_date between GETDATE()-60 and GETDATE()-30")
}
scope :no_test_users, lambda {
where("email not like '%@company.com' and email not like '%@other_company.com'")
}
所有作用域都单独工作(也可以相互配合)。问题是如何以有效的方式获取Event.active_events.last_week 和Event.active_events.last_month 的电子邮件。
【问题讨论】:
-
它看起来只返回上周的用户,前提是他们在上个月也有合格的活动。那是对的吗?什么是型号名称?
-
是的,完全正确。该模型名为 Event。
-
还有用户模型?他们是如何加入的?通过电子邮件?
-
没有用户模型。我基本上只是从 user_event_tracking 表中取回电子邮件地址列表。
标签: sql ruby-on-rails sql-server activerecord