活动记录:自X日期以来未创建事件的用户

时间:2013-08-18 15:53:37

标签: ruby-on-rails ruby-on-rails-3 activerecord

这可能很简单,但我在做这件事时遇到了一些麻烦。

我有一个用户模型和事件模型。两者都有通常的created_at属性。用户可以拥有许多事件,并且事件属于用户。

想要做的是在活动记录中写一些内容,以便向我提供自给定日期以来尚未创建事件的所有用户。

我已经成功完成了多个循环,但效率非常低。是否可以使用一个语句或命名范围有效地执行此操作?

我有一个命名范围来计算用户的事件:

  scope :user_event_count,
      select("users.id, count(events.id) AS events_count").
      joins(:events).
      group("users.id").
      order("events_count DESC")

我想知道是否有类似可能,但我在查找如何找到用户提交的最后一个事件时遇到了麻烦。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

这是关于如何实现这一目标的分手。

  1. 选择自给定日期以来创建的所有事件的所有用户
  2. 选择不在上述设置中的所有用户
  3. 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")

如果你有大量的事件,那么将它构建为一个查询可能会更有效率,因为在特定时间之前存在一个事件,并且从那时起就不存在事件。