page_view.rb
1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class AnalyticsPlugin::PageView < ActiveRecord::Base
serialize :data
attr_accessible *self.column_names
attr_accessible :user, :profile
attr_accessor :request
attr_accessible :request
acts_as_having_settings field: :options
belongs_to :visit, class_name: 'AnalyticsPlugin::Visit'
belongs_to :referer_page_view, class_name: 'AnalyticsPlugin::PageView'
belongs_to :user, class_name: 'Person'
belongs_to :session, primary_key: :session_id, foreign_key: :session_id, class_name: 'Session'
belongs_to :profile
validates_presence_of :visit
validates_presence_of :request, on: :create
validates_presence_of :url
before_validation :extract_request_data, on: :create
before_validation :fill_referer_page_view, on: :create
before_validation :fill_visit, on: :create
def request_duration
self.request_finished_at - self.request_started_at
end
def page_load!
self.page_loaded_at = Time.now
self.update_column :page_loaded_at, self.page_loaded_at
end
def increase_time_on_page!
now = Time.now
initial_time = self.page_loaded_at || self.request_finished_at
return unless now > initial_time
self.time_on_page = now - initial_time
self.update_column :time_on_page, self.time_on_page
end
protected
def extract_request_data
self.url = self.request.url.sub /\/+$/, ''
self.referer_url = self.request.referer
self.user_agent = self.request.headers['User-Agent']
self.request_id = self.request.env['action_dispatch.request_id']
self.remote_ip = self.request.remote_ip
end
def fill_referer_page_view
self.referer_page_view = AnalyticsPlugin::PageView.order('request_started_at DESC').
where(url: self.referer_url, session_id: self.session_id, user_id: self.user_id, profile_id: self.profile_id).first if self.referer_url.present?
end
def fill_visit
self.visit = self.referer_page_view.visit if self.referer_page_view
self.visit ||= AnalyticsPlugin::Visit.new profile: profile
end
end