假设我有一个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)
答案 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的用户设置部分索引(如果您的数据库支持)可能是个好主意。