这可能很简单,但我在做这件事时遇到了一些麻烦。
我有一个用户模型和事件模型。两者都有通常的created_at属性。用户可以拥有许多事件,并且事件属于用户。
想要做的是在活动记录中写一些内容,以便向我提供自给定日期以来尚未创建事件的所有用户。
我已经成功完成了多个循环,但效率非常低。是否可以使用一个语句或命名范围有效地执行此操作?
我有一个命名范围来计算用户的事件:
scope :user_event_count,
select("users.id, count(events.id) AS events_count").
joins(:events).
group("users.id").
order("events_count DESC")
我想知道是否有类似可能,但我在查找如何找到用户提交的最后一个事件时遇到了麻烦。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
这是关于如何实现这一目标的分手。
subquery = Event.select("user_id").where("created_at >= :start_date", {start_date: params[:start_date]}).to_sql; User.where("id NOT IN (#{subquery})")
希望这有帮助。
答案 1 :(得分:0)
听起来你想要的是最大事件创建日期早于一段时间的用户。
scope :user_event_count,
select("users.id, max(events.created_at) AS max_event_created_at").
joins(:events).
group("users.id").
having("max(events.created_at) < :start_date")
如果你有大量的事件,那么将它构建为一个查询可能会更有效率,因为在特定时间之前存在一个事件,并且从那时起就不存在事件。