使用Rails+Devise筛选sign_in_count大于x次的用户失败求助
解决Devise Trackable登录次数筛选问题
我之前也碰到过类似的情况,大概率是查询语句的写法有问题,或者配置环节有小疏漏,咱们一步步来排查解决:
1. 先确认Trackable模块的配置正确性
首先再核对下你的User模型,确保已经正确引入了Trackable模块:
# app/models/user.rb class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :trackable # 这个必须存在 end
同时确认数据库里users表的sign_in_count字段是整数类型(Devise生成的默认类型就是integer),如果字段类型不对(比如不小心设成了string),数值比较的条件就会失效。
2. 使用正确的查询语句
你之前的查询没生效,应该是写法有误。试试这两种正确的方式:
方式一:SQL字符串绑定参数(推荐,避免SQL注入)
在Rails控制台里执行:
# 把x换成你要的阈值,比如5 User.where("sign_in_count > ?", x)
方式二:Rails范围查询语法
更Ruby化的写法,同样替换x为你的阈值:
User.where(sign_in_count: (x + 1)..)
这个语法表示sign_in_count大于x(因为范围是x+1到无穷大)。
3. 验证数据与结果
如果还是返回所有用户,先确认数据库里是否真的有登录次数超过x的用户:
# 查看所有用户的邮箱和登录次数 User.pluck(:email, :sign_in_count)
如果所有用户的sign_in_count都≤x,那查询返回空或者所有用户(取决于你之前的错误写法)就很正常了。
4. 进阶:添加模型Scope方便复用
如果需要经常做这个筛选,可以在User模型里定义一个scope:
# app/models/user.rb scope :frequent_logins, ->(min_count) { where("sign_in_count > ?", min_count) }
之后就可以直接用:
User.frequent_logins(10) # 获取登录次数超过10次的用户
内容的提问来源于stack exchange,提问作者Tom Connolly
相关产品推荐
相关产品推荐

