我想跟踪用户登录历史统计的目的,但它不是我清楚什么是最好的方式去这将是。 我可以有一个单独的表,记录用户的登录统计与日期,但该表可以得到非常大的。 我可以跟踪一些历史领域的用户模型/在语法分析领域对象本身,只是一些分隔字符串格式更新它(它们)。 例如,分上:,拿到最后一个,如果今天的日期包含的代码不是,添加一个项目(日期+计数),否则增量,然后将其重新保存。 至少在这第二种方法会很容易移除旧的项目(例如只保留每天登录的30天或IPS),作为一个单独的表就需要一个任务来删除旧记录。
我的瞬间变化的大风扇。 任务是有用的,但可以为维护原因复杂的事情。
任何人有什么建议? 我没有外部数据缓存解决方案上或任何东西。 任何指针也欢迎! (我一直在找类似的问题和答案)
谢谢!
Answer 1:
如果您有:可跟踪模块,我发现这个最简单的方法。 在用户模式(或任何模型你验证)
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 )
Answer 2:
有一个很好的办法做到这一点通过设计。
监狱长建立了一个名为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
Answer 3:
制定支持跟踪日期签署了最后,最后在IP地址申请与它的:trackable
模块。 通过添加该模块到您的用户模型,然后还加入了正确的字段到您的数据库,它们是:
: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::SessionsController
和它的create
行动,然后保存:last_sign_in_at
和:last_sign_in_ip
到一个单独的表中before_create
回调。 然后,您应该能够让他们只要你想。
Answer 4:
下面是一个例子(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
添加了一大堆指标,根据查询
在每次请求创建一个网页浏览
我们使用了手工打造的SQL查询拿出这个ActiveRecord的开销
可以尝试MySQL的“插入delayed'
分析查询通常手工编写SQL
使用“解释select'确保MySQL的isusing你所期望的指标
秤不错
但分析查询价格昂贵,可以堵塞upmain DB服务器
我们的解决方案:
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
检查另一种选择是Gattica与谷歌Analytics(分析)
Answer 5:
我讨厌回答我自己的问题,特别是考虑到你俩给有用的答案。 我想回答我的问题与我把可能帮助别人,在你的答案相结合的办法。
我一直在玩的印象派宝石(因为抛弃RailStat唯一有用的页面视图GEM)具有良好的效果为止。 设置基本迁移后,我发现,预期使用如下铁的MVC设计非常密切。 如果添加了“印象派”到控制器,它会记录页面视图到数据库时寻找的模型。 您可以修改此行为或只是调用印象派自己在你的控制器(或任何地方真的),如果你和我一样,发生了被测试它在不具有模型的控制器。
不管怎么说,我把它与设计工作通过重写设计:: SessionsController,只是呼吁@current_member印象派的方法来跟踪成功登录:(不要忘记检查,如果是零上登录失败!)
class TestSessionController < Devise::SessionsController
def create
if not @current_member.nil?
impressionist(@current_member)
end
super
end
end
将它添加到其他网站的部分后的一些有限的分析是很容易做到。 我所要做的唯一的另一件事是更新我的航线使用新TestSessionController的设计登录路由:
post 'login' => 'test_session#create', :as => :member_session
设计像正常工作,而无需修改设计,无论如何,我的印象派DB表是索引和日志登录。 我只是需要一个rake任务以后每周左右修剪。
现在我只需要工作,如何以图表每天登录,而无需写一堆循环,脏查询...
Answer 6:
对构建@ 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
Answer 7:
还有“paper_trail”的宝石 ,它允许跟踪模式的转变。
文章来源: An efficient way to track user login dates and IPs history