page_view.rb
3.27 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class AnalyticsPlugin::PageView < ApplicationRecord
serialize :data
attr_accessible *self.column_names
attr_accessible :user, :profile
attr_accessor :request
attr_accessible :request
extend ActsAsHavingSettings::ClassMethods
acts_as_having_settings field: :options
belongs_to :profile, validate: true
belongs_to :visit, class_name: 'AnalyticsPlugin::Visit', touch: true, validate: true
belongs_to :referer_page_view, class_name: 'AnalyticsPlugin::PageView', validate: false
belongs_to :user, class_name: 'Person', validate: false
belongs_to :session, primary_key: :session_id, foreign_key: :session_id, class_name: 'Session', validate: false
validates :request, presence: true, on: :create
validates :url, presence: true
before_validation :extract_request_data, on: :create
before_validation :fill_referer_page_view, on: :create
before_validation :fill_visit, on: :create
before_validation :fill_is_bot, on: :create
after_update :destroy_empty_visit
after_destroy :destroy_empty_visit
scope :in_sequence, -> { order 'analytics_plugin_page_views.request_started_at ASC' }
scope :page_loaded, -> { where 'analytics_plugin_page_views.page_loaded_at IS NOT NULL' }
scope :not_page_loaded, -> { where 'analytics_plugin_page_views.page_loaded_at IS NULL' }
scope :no_bots, -> { where.not is_bot: true }
scope :bots, -> { where is_bot: true }
scope :loaded_users, -> { in_sequence.page_loaded.no_bots }
def request_duration
self.request_finished_at - self.request_started_at
end
def initial_time
self.page_loaded_at || self.request_finished_at
end
def user_last_time_seen
self.initial_time + self.time_on_page
end
def user_on_page?
Time.now < self.user_last_time_seen + AnalyticsPlugin::TimeOnPageUpdateInterval
end
def page_load! time
self.page_loaded_at = time
self.update_column :page_loaded_at, self.page_loaded_at
end
def increase_time_on_page!
now = Time.now
return unless now > self.initial_time
self.time_on_page = now - self.initial_time
self.update_column :time_on_page, self.time_on_page
end
def find_referer_page_view
return if self.referer_url.blank?
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
end
def browser
@browser ||= Browser.new self.user_agent
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
true
end
def fill_referer_page_view
self.referer_page_view = self.find_referer_page_view
true
end
def fill_visit
self.visit = self.referer_page_view.visit if self.referer_page_view and self.referer_page_view.user_on_page?
self.visit ||= AnalyticsPlugin::Visit.new profile: profile
true
end
def fill_is_bot
self.is_bot = self.browser.bot?
true
end
def destroy_empty_visit
return unless self.visit_id_changed?
old_visit = AnalyticsPlugin::Visit.find self.visit_id_was
old_visit.destroy if old_visit.page_views.empty?
end
end