0

这可能很简单,但我很难做到这一点。

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

想要做的是在活动记录中写一些东西给我所有自给定日期以来没有创建事件的用户。

我已经设法用多个循环来做到这一点,但它的效率非常低。是否可以使用一个语句或命名范围有效地做到这一点?

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

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

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

谁能指出我正确的方向?

4

2 回答 2

1

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

  1. 为自给定日期以来创建的所有事件选择所有用户
  2. 选择所有不在上述集合中的用户
子查询 = Event.select("user_id").where("created_at >= :start_date", {start_date: params[:start_date]}).to_sql;
User.where("id 不在 (#{subquery})")

希望这可以帮助。

于 2013-08-18T16:30:52.737 回答
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")

如果您有大量事件,则将其构造为查询可能会更有效,其中在特定时间之前存在事件并且从那时起不存在事件。

于 2013-08-18T17:29:57.393 回答