找到具有某些关联的用户的最佳方式

时间:2015-04-26 10:30:07

标签: ruby-on-rails

假设我有一个User模型,每个用户都有一个名为user_logins的关联,每次登录时都会创建该关联,并存储有关其登录信息。

我需要做的是找到所有拥有5条user_login记录的用户,其中第五条记录是今天创建的。

这样的事情:

users = User.all.where(user_logins_count == 5, user_login.last.created_at == today)

user_logins_count是我设置的计数器缓存。

当然,这段代码是残酷的,但希望它能详细说明我想要实现的目标。

PG ERROR

rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "last
"
LINE 1: ...n_logins_count" = 5 GROUP BY humans.id HAVING MAX(human_logi...
                                                             ^

新代码:

humans = user.humans.joins(:human_logins).where(human_logins_count: 5)
        .group('humans.id')
        .having('MAX(human_logins.created_at) >= ?', Date.today)

1 个答案:

答案 0 :(得分:3)

您可以将其定义为User类中的范围:

class User
  scope :logged_in_a_lot_today, -> do
    joins(:user_logins).where(user_logins_count: 5)
      .group('users.id')
      .having('MAX(user_logins.created_at) >= ?', Date.today)
  end
end

现在您可以通过以下方式获取这些用户:

User.logged_in_a_lot_today

由于它被定义为范围,因此如果您愿意,还可以添加更多条件:

User.logged_in_a_lot_today.where(name: 'John Doe')

请注意,对user_logins_count为5的用户设置部分索引(如果您的数据库支持)可能是个好主意。