gar*_*man 4 devise ruby-on-rails-3
我正在尝试跟踪用户登录历史记录以进行统计,但我不清楚最好的方法是什么.我可以有一个单独的表来记录用户和他们的登录统计数据与日期,但该表可能真的很大.我可以在一个可解析的字段中跟踪User模型/对象本身中的一些历史字段,然后用一些分隔的字符串格式更新它们(它们).例如拆分:,得到最后一个,如果包含的日期代码不是今天,添加一个项目(日期+计数)否则增加,然后保存回来.至少使用第二种方法,可以很容易地删除旧项目(例如,仅保留30天的每日登录或IP),因为单独的表将需要删除旧记录的任务.
我是即时变化的忠实粉丝.任务很有用,但出于维护原因可能会使事情变得复杂.
有人有什么建议吗?我还没有外部数据缓存解决方案.任何指针也欢迎!(我一直在寻找类似的问题和答案)
谢谢!
如果你有:trackable模块,我发现这是最简单的方法.在用户模型中(或您正在验证的模型)
def update_tracked_fields!(request)
old_signin = self.last_sign_in_at
super
if self.last_sign_in_at != old_signin
Audit.create :user => self, :action => "login", :ip => self.last_sign_in_ip
end
end
Run Code Online (Sandbox Code Playgroud)
(灵感来自https://github.com/plataformatec/devise/wiki/How-To:-Turn-off-trackable-for-admin-users)
有一种通过Devise做到这一点的好方法。
监狱长设置了一个名为after_set_user的钩子,该钩子在设置用户后运行。因此,假设您有一个包含IP字段,login_in_at字段和user_id字段的模型Login,则只能使用此字段创建记录。
Warden::Manager.after_set_user :except => :fetch do |record, warden, options|
Login.create!(:ip => warden.request.ip, :logged_in_at => Time.now, :user_id => record.id)
end
Run Code Online (Sandbox Code Playgroud)
以@user208769 的回答为基础,核心Devise::Models::Trackable#update_tracked_fields!方法现在调用一个update_tracked_fields在保存之前命名的辅助方法。这意味着您可以使用ActiveRecord::Dirty帮助程序使其更简单:
def update_tracked_fields(request)
super
if last_sign_in_at_changed?
Audit.create(user: self, action: 'login', ip: last_sign_in_ip)
end
end
Run Code Online (Sandbox Code Playgroud)
如果audits是您的模型上的关系,则可以进一步简化(并且在给定验证的情况下更可靠):
def update_tracked_fields(request)
super
audits.build(action: 'login', ip: last_sign_in_ip) if last_sign_in_at_changed?
end
Run Code Online (Sandbox Code Playgroud)
我讨厌回答自己的问题,尤其是考虑到你们都给出了有用的答案。我认为用我采取的方法回答我的问题,结合您的答案可能会对其他人有所帮助。
我一直在使用Impressionist Gem(自废弃的 RailStat 以来唯一有用的页面视图 Gem),到目前为止效果良好。设置基本迁移后,我发现预期的用法非常符合 Rail 的 MVC 设计。如果将“impressionist”添加到控制器中,它将在将页面视图记录到数据库时寻找模型。如果您像我一样并且碰巧在没有模型的控制器上对其进行测试,则可以修改此行为或在控制器(或实际上的任何地方)中自己调用印象派。
无论如何,我让它与 Devise 一起工作,通过覆盖 Devise::SessionsController 并调用 @current_member 的印象派方法来跟踪成功登录:(不要忘记检查它是否为 nil!登录失败时)
class TestSessionController < Devise::SessionsController
def create
if not @current_member.nil?
impressionist(@current_member)
end
super
end
end
Run Code Online (Sandbox Code Playgroud)
稍后将其添加到其他站点部分以进行一些有限的分析很容易做到。我唯一要做的另一件事是更新我的路由以使用新的 TestSessionController 作为 Devise 登录路由:
post 'login' => 'test_session#create', :as => :member_session
Run Code Online (Sandbox Code Playgroud)
Devise 可以正常工作,而无需以任何方式修改 Devise,而且我的印象派数据库表已建立索引并记录登录信息。稍后我只需要一个耙子任务来每周左右修剪它。
现在我只需要弄清楚如何绘制每日登录图表,而不必编写一堆循环的脏查询......
| 归档时间: |
|
| 查看次数: |
5476 次 |
| 最近记录: |