6

我正在尝试出于统计目的跟踪用户登录历史记录,但我不清楚最好的方法是什么。我可以有一个单独的表来记录用户和他们的登录统计信息,但该表可能会变得非常大。我可以在可解析字段中跟踪用户模型/对象本身中的一些历史字段,并使用一些分隔字符串格式更新它(它们)。例如拆分:,获取最后一个,如果包含的日期代码不是今天,则添加一个项目(日期+计数),否则递增,然后将其保存回来。至少使用第二种方法很容易删除旧项目(例如,只保留 30 天的每日登录或 IP),因为单独的表需要删除旧记录的任务。

我是即时变化的忠实粉丝。任务很有用,但出于维护原因可能会使事情复杂化。

有人有什么建议吗?我还没有外部数据缓存解决方案或任何东西。也欢迎任何指点!(我一直在寻找类似的问题和答案)

谢谢!

4

7 回答 7

8

如果你有 :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

(灵感来自https://github.com/plataformatec/devise/wiki/How-To:-Turn-off-trackable-for-admin-users

于 2013-11-29T00:56:06.840 回答
5

通过 Devise 有一个很好的方法来做到这一点。

Warden 设置了一个名为 after_set_user 的钩子,该钩子在设置用户后运行。因此,假设您有一个包含 ip 字段、logged_in_at 字段和 user_id 字段的模型登录,您只能使用此字段创建记录。

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
于 2012-05-09T14:58:02.823 回答
5

基于@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

audits如果您的模型有关系,则可以进一步简化(并且在给定验证的情况下更可靠) :

def update_tracked_fields(request)
  super
  audits.build(action: 'login', ip: last_sign_in_ip) if last_sign_in_at_changed?
end
于 2015-02-24T20:21:53.467 回答
4

Devise 支持使用其:trackable模块跟踪上次登录日期和上次登录 IP 地址。通过将此模块添加到您的用户模型,然后还将正确的字段添加到您的数据库中,它们是:

:sign_in_count,      :type => Integer, :default => 0
:current_sign_in_at, :type => Time
:last_sign_in_at,    :type => Time
:current_sign_in_ip, :type => String
:last_sign_in_ip,    :type => String

然后,您可以覆盖Devise::SessionsControllerand 它的create操作,然后在回调中将:last_sign_in_atand保存:last_sign_in_ip到单独的表中。before_create然后,您应该能够随心所欲地保留它们。

于 2012-05-17T00:38:38.830 回答
3

这是一个示例(scribd_analytics)

create_table 'page_views' do |t|
  t.column 'user_id', :integer 
  t.column 'request_url', :string, :limit => 200
  t.column 'session', :string, :limit => 32
  t.column 'ip_address', :string, :limit => 16
  t.column 'referer', :string, :limit => 200
  t.column 'user_agent', :string, :limit => 200
  t.column 'created_at', :timestamp
end

添加一大堆索引,具体取决于查询

在每个请求上创建一个 PageView

我们使用手动构建的 SQL 查询来消除 ActiveRecord 开销

可能会尝试 MySQL 的“插入延迟”

分析查询通常是手工编码的 SQL

使用“解释选择”来确保 MySQL 正在使用您期望的索引

规模相当不错

但是分析查询很昂贵,可能会阻塞上游数据库服务器

我们的解决方案:

use two DB servers in a master/slave setup

move all the analytics queries to the slave

http://www.scribd.com/doc/49575/Scaling-Rails-Presentation-From-Scribd-Launch


另一个检查选项是带有 Google Analytics 的 Gattica

于 2012-05-08T15:19:07.947 回答
3

我讨厌回答我自己的问题,尤其是考虑到你们都给出了有用的答案。我认为用我采取的方法回答我的问题可能会帮助其他人,结合你的答案。

到目前为止,我一直在使用Impressionist Gem(自废弃 RailStat 以来唯一有用的页面视图 Gem)并取得了不错的效果。在设置了基本迁移之后,我发现预期的用法非常接近 Rail 的 MVC 设计。如果您将“印象派”添加到控制器,它将在将页面视图记录到数据库时寻找模型。如果您像我一样并且碰巧在没有模型的控制器上对其进行测试,您可以修改此行为,或者只是在您的控制器(或任何地方)中自己调用印象派。

无论如何,我通过重写 Devise::SessionsController 并仅调用 @current_member 的印象派方法来使用 Devise 跟踪成功登录:(不要忘记检查它是否为 nil!登录失败)

class TestSessionController < Devise::SessionsController
  def create
    if not @current_member.nil?
      impressionist(@current_member)
    end
    super
  end
end

稍后将其添加到其他站点部分以进行一些有限的分析很容易。我唯一要做的另一件事是更新我的路由以使用新的 TestSessionController 作为 Devise 登录路由:

post 'login' => 'test_session#create', :as => :member_session

Devise 可以正常工作,而无需以任何方式修改 Devise,并且我的印象派数据库表已编入索引并记录登录。稍后我只需要一个 rake 任务来每周左右修剪它。

现在我只需要弄清楚如何绘制每日登录图表,而不必编写一堆循环的脏查询......

于 2012-05-09T21:01:55.353 回答
0

还有'paper_trail' gem,允许跟踪模型更改。

于 2016-02-16T21:17:11.747 回答