ruby on rails 3 - saber - Una forma eficiente de rastrear las fechas de inicio de sesión de los usuarios y el historial de direcciones IP
rastrear pagina web (7)
Aquí hay un ejemplo (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
Agregue un montón de índices, dependiendo de las consultas
Crea un PageView en cada solicitud
Usamos una consulta SQL construida a mano para extraer la sobrecarga de ActiveRecord en este
Podría probar la inserción de MySQL con retraso
Las consultas de Analytics suelen codificarse a mano en SQL
Use ''explicar selección'' para asegurarse de que MySQL utiliza los índices que espera
Escala bastante bien
PERO las consultas analíticas son costosas, pueden obstruir el servidor principal de la base de datos
Nuestra solución:
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
Otra opción para verificar es Gattica con Google Analytics
Intento rastrear el historial de inicio de sesión del usuario para fines estadísticos, pero no está claro para mí cuál sería la mejor manera de hacerlo. Podría tener una tabla separada que registre los usuarios y sus estadísticas de inicio de sesión con una fecha, pero esa tabla podría ponerse REALMENTE grande. Podría rastrear algunos campos históricos en el modelo / objeto del usuario en un campo analizable y simplemente actualizarlo (ellos) con algún formato de cadena delimitado. por ejemplo, dividir en:, obtener el último, si un código de fecha incluido no es hoy, agregar un elemento (fecha + recuento) de lo contrario aumentar, luego guardarlo de nuevo. Al menos con este segundo enfoque, sería fácil eliminar elementos antiguos (por ejemplo, solo mantener 30 días de inicios de sesión diarios o direcciones IP), ya que una tabla separada requeriría una tarea para eliminar registros antiguos.
Soy un gran fan de los cambios instantáneos. Las tareas son útiles, pero pueden complicar las cosas por razones de mantenimiento.
¿Alguien tiene alguna sugerencia? Aún no tengo una solución de almacenamiento en caché de datos externa ni nada. ¡Cualquier apuntador también es bienvenido! (He estado buscando preguntas y respuestas similares)
¡Gracias!
Hay una buena manera de hacerlo a través de Devise.
Warden configura un gancho llamado after_set_user que se ejecuta después de configurar un usuario. Entonces, suponiendo que tiene un Login modelo que contiene un campo ip, un campo logged_in_at y un campo user_id, solo puede crear el registro usando estos campos.
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
Odio responder mis propias preguntas, especialmente dado que ambos dieron respuestas útiles. Creo que responder mi pregunta con el enfoque que tomé podría ayudar a otros, en combinación con sus respuestas.
He estado jugando con la gema impresionista (la única gema de vista de página útil desde el RailStat abandonado) con buenos resultados hasta ahora. Después de configurar la migración básica, descubrí que el uso esperado sigue muy de cerca el diseño MVC de Rail. Si agrega "impresionista" a un Controlador, buscará el Modelo al iniciar sesión en la vista de página. Puede modificar este comportamiento o simplemente llamar al impresionista usted mismo en su Controlador (o en cualquier lugar realmente) si es como yo y lo está probando en un Controlador que no tiene un Modelo.
De todos modos, lo conseguí trabajando con Devise para rastrear los inicios de sesión exitosos anulando el Devise :: SessionsController y simplemente llamando al método impresionista para el @current_member: (¡no olvides comprobar si es nulo! En el inicio de sesión fallido)
class TestSessionController < Devise::SessionsController
def create
if not @current_member.nil?
impressionist(@current_member)
end
super
end
end
Agregarlo a otras partes del sitio más tarde para algunos análisis limitados es fácil de hacer. La única otra cosa que tuve que hacer fue actualizar mis rutas para usar el nuevo TestSessionController para la ruta de inicio de sesión de Devise:
post ''login'' => ''test_session#create'', :as => :member_session
Devise funciona de forma normal sin tener que modificar Devise de todos modos, y mi tabla de DB impresionista se indexa y registra los inicios de sesión. Solo necesitaré una tarea de rastrillo más tarde para recortarla semanalmente más o menos.
Ahora solo necesito averiguar cómo registrar inicios de sesión diarios sin tener que escribir un montón de bucles, consultas sucias ...
Si tiene el módulo: trackable, encontré esto de la manera más fácil. En el modelo de Usuario (o en cualquier modelo que esté autenticando)
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
(Inspirado por https://github.com/plataformatec/devise/wiki/How-To:-Turn-off-trackable-for-admin-users )
También hay gema ''paper_trail'' , que permite rastrear los cambios del modelo.
Devise admite el seguimiento de la última fecha de inicio de sesión y la última dirección IP registrada con su :trackable
módulo :trackable
. Al agregar este módulo a su modelo de usuario, y luego también agregar los campos correctos a su base de datos, que son:
: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
A continuación, puede anular el Devise::SessionsController
y create
acción para guardar el :last_sign_in_at
y :last_sign_in_ip
en una tabla separada en una before_create
llamada before_create
. Debería poder mantenerlos el tiempo que desee.
Basándose en la respuesta de @ user208769 , el núcleo Devise::Models::Trackable#update_tracked_fields!
método ahora llama a un método auxiliar llamado update_tracked_fields
antes de guardar. Eso significa que puede usar ActiveRecord::Dirty
helpers para hacerlo un poco más simple:
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
Esto puede simplificarse aún más (y ser más confiable si se validan) si las audits
son una relación en su modelo:
def update_tracked_fields(request)
super
audits.build(action: ''login'', ip: last_sign_in_ip) if last_sign_in_at_changed?
end