Linkers Tech Blog

リンカーズ株式会社の開発者ブログです。

イベントトラッキング用gem ahoyで、deviseの複数のユーザモデルを取り扱う

ahoy導入の経緯と課題

ahoyはRailsアプリケーションにアナリティクスツールを組み込むためのgemで、Railsアプリケーション上でユーザ行動ログを取得し、保存することができます。データの保存先としてActiveRecordを選択することができるので、最小構成のインフラでも簡単に導入することができます。また、Railsアプリケーションの一部として動くため、Google Analyticsへの接続を制限している環境のユーザの行動も補足することができるというメリットもあります。

開発中のRailsアプリケーションは認証用のライブラリとしてdeviseを利用しており、お客様と社内のスタッフをテーブル単位で分けています。ahoyは標準では複数のモデルに対応していないため、導入するにあたってこの問題を解決する必要がありました。

GitHub上に、deviseの複数のユーザモデルに対応させたいというIssue( Multiple Devise models · Issue #38 · ankane/ahoy · GitHub )が上がっており、 polymorphic関連で解決する、というgemの作者からの回答があるのですが、その具体的な手続きまでは書かれていません。 今回はその手順をまとめました。

ahoyの導入方法

公式のREADMEか、わかりやすいQiita記事を読んでください。

github.com qiita.com

複数のdeviseのモデルのユーザをトラッキングする設定の手順

ここでは、deviseのユーザモデルが、staff, cutomerの二種類あるとして話を進めます。

まずREADMEのcustom user methodにあるように、コントローラ内でアクセス中のユーザのデータにアクセスするための設定を変更します。

# config/initializers/ahoy.rb
Ahoy.user_method = ->(controller) { current_staff || current_customer }

Ahoy::Visit, Ahoy::Eventのモデルのbelong_toの部分をポリモーフィック関連に置き換えます。

# event.rb
class Ahoy::Event < ApplicationRecord
  include Ahoy::QueryMethods
  self.table_name = 'ahoy_events'
  belongs_to :visit
  belongs_to :user, optional: true, polymorphic: true
end
# visit.rb
class Ahoy::Visit < ApplicationRecord
  self.table_name = 'ahoy_visits'
  has_many :events, class_name: 'Ahoy::Event'
  belongs_to :user, optional: true, polymorphic: true
end

データベースに保存するので、カラムの追加が必要ですね。追加しましょう。

class AddUserTypeToAhoyVisitsAndEvents < ActiveRecord::Migration[5.2]
  def change
    add_column :ahoy_visits, :user_type, :string, after: :visitor_token
    add_column :ahoy_events, :user_type, :string, after: :visit_id
  end
end

また、eventに保存されるデータにカラムを追加する手続きが必要になります。

# config/initializers/ahoy.rb
class Ahoy::Store < Ahoy::DatabaseStore
  def track_event(data)
    data[:user_type] = controller.current_staff ? 'Staff' : 'Customer'
    super(data)
  end
end

以上で完成です。 あとは、好きなページにトラッキングコードを入れることで、複数のユーザモデルに対応した状態でユーザの行動を分析できるようになります。

自己紹介

浜田です。開発に関わるいろんなお仕事とサーバのお守りを担当しています。