Moved calculated fields to model

Andrew Kane committed Feb 27, 2014
commit d23640747e655f263239fc7d14470575ea9cdd37
Showing 5 changed files with 76 additions and 57 deletions
ahoy_matey.gemspec +1 -0
@@ @@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
spec.add_dependency "addressable"
spec.add_dependency "browser", ">= 0.4.0"
spec.add_dependency "geocoder"
+ spec.add_dependency "referer-parser"
spec.add_development_dependency "bundler", "~> 1.5"
spec.add_development_dependency "rake"
app/controllers/ahoy/visits_controller.rb +4 -55
@@ @@ -14,61 +14,10 @@ module Ahoy
v.user = current_user if respond_to?(:current_user)
end
- referring_uri = Addressable::URI.parse(params[:referrer]) rescue nil
- if referring_uri
- visit.referring_domain = referring_uri.host
- end
-
- landing_uri = Addressable::URI.parse(params[:landing_page]) rescue nil
- if landing_uri
- query_values = landing_uri.query_values || {}
- %w[utm_source utm_medium utm_term utm_content utm_campaign].each do |name|
- visit[name] = query_values[name]
- end
- end
-
- visit.browser = browser.name
-
- # TODO add more
- visit.os =
- if browser.android?
- "Android"
- elsif browser.ios?
- "iOS"
- elsif browser.windows_phone?
- "Windows Phone"
- elsif browser.blackberry?
- "Blackberry"
- elsif browser.chrome_os?
- "Chrome OS"
- elsif browser.mac?
- "Mac"
- elsif browser.windows?
- "Windows"
- elsif browser.linux?
- "Linux"
- end
-
- visit.device_type =
- if browser.tv?
- "TV"
- elsif browser.console?
- "Console"
- elsif browser.tablet?
- "Tablet"
- elsif browser.mobile?
- "Mobile"
- else
- "Desktop"
- end
-
- # location
- location = Geocoder.search(request.remote_ip).first rescue nil
- if location
- visit.country = location.country.presence
- visit.region = location.state.presence
- visit.city = location.city.presence
- end
+ visit.set_traffic_source
+ visit.set_technology
+ visit.set_location
+ visit.set_utm_parameters
visit.save!
render json: {id: visit.id}
app/models/ahoy/visit.rb +67 -0
@@ @@ -1,5 +1,72 @@
module Ahoy
class Visit < ActiveRecord::Base
belongs_to :user, polymorphic: true
+
+ def set_traffic_source
+ referring_uri = Addressable::URI.parse(referrer) rescue nil
+ if referring_uri
+ self.referring_domain = referring_uri.host
+ self.search_keyword = (RefererParser::Referer.new(referrer).search_term.to_s.presence rescue nil)
+ end
+ end
+
+ def set_utm_parameters
+ landing_uri = Addressable::URI.parse(landing_page) rescue nil
+ if landing_uri
+ query_values = landing_uri.query_values || {}
+ %w[utm_source utm_medium utm_term utm_content utm_campaign].each do |name|
+ self[name] = query_values[name]
+ end
+ end
+ end
+
+ def set_technology
+ browser = Browser.new(ua: user_agent)
+
+ self.browser = browser.name
+
+ # TODO add more
+ self.os =
+ if browser.android?
+ "Android"
+ elsif browser.ios?
+ "iOS"
+ elsif browser.windows_phone?
+ "Windows Phone"
+ elsif browser.blackberry?
+ "Blackberry"
+ elsif browser.chrome_os?
+ "Chrome OS"
+ elsif browser.mac?
+ "Mac"
+ elsif browser.windows?
+ "Windows"
+ elsif browser.linux?
+ "Linux"
+ end
+
+ self.device_type =
+ if browser.tv?
+ "TV"
+ elsif browser.console?
+ "Console"
+ elsif browser.tablet?
+ "Tablet"
+ elsif browser.mobile?
+ "Mobile"
+ else
+ "Desktop"
+ end
+ end
+
+ def set_location
+ location = Geocoder.search(ip).first rescue nil
+ if location
+ self.country = location.country.presence
+ self.region = location.state.presence
+ self.city = location.city.presence
+ end
+ end
+
end
end
ahoy_matey.rb b/lib/ahoy_matey.rb +1 -0
@@ @@ -3,6 +3,7 @@ require "ahoy/controller_extensions"
require "addressable/uri"
require "browser"
require "geocoder"
+ require "referer-parser"
module Ahoy
class Engine < ::Rails::Engine
generators/ahoy/templates/install.rb b/lib/generators/ahoy/templates/install.rb +3 -2
@@ @@ -8,15 +8,16 @@ class <%= migration_class_name %> < ActiveRecord::Migration
# standard
t.string :ip
t.text :user_agent
+ t.text :referrer
+ t.text :landing_page
# user
t.integer :user_id
t.string :user_type
# traffic source
- t.text :referrer
t.string :referring_domain
- t.text :landing_page
+ t.string :search_keyword
# technology
t.string :browser