Header
2020-01-15
2020-01-16

RailsでABテストをするfor ahoy

2020 01 15 marketing

RailsでABテストしようと思った際にAhoyを利用すれば可能になったので記載します。

ahoyはイベントトラッキングを行えるgemになります

ahoyの概要とできる事

ahoyはサイトを閲覧したユーザーにUUIDを生成します。

これを利用して

1:ボタンやサイトのABテスト

2:未会員登録かつ再訪者限定でメール配信やモーダルを表示する

3:ユーザーのページ遷移の分析

などが可能になります。

今回はahoyの導入とデータの呼び出し部分まで解説します。

もちろんahoyだけでなく、グーグルタグマネージャーなどでもボタンやサイトへタグを設定して上記が可能になりますが、 一般的にグーグルタグマネージャーなどはマーケティング部などがタグを発行と管理をすることが多いです。

ただ毎回別部署に依頼するのは非常に手間なので、エンジニア単体でタグ発行から計測まで行えるようにしたく今回のahoyを 試してみました

公式サイト

ahoyを導入する

マイグレーションを実行する

以下を追記しbundle installする

gem 'ahoy_matey'

その後ahoyの各種ファイルをインストールします

rails generate ahoy:install

すると以下が生成されます。

config/initializers/ahoy.rb
app/models/ahoy/visit.rb
app/models/ahoy/event.rb
db/migrate/20200115053403_create_ahoy_visits_and_events.rb

注意点

ahoy_visitsのマイグレーションファイルにjson型のカラムが設定されています。

    create_table :ahoy_events do |t|

      t.json :properties
      t.timestamp :time
    end

Mysqlは5.7.8以降にjson型に対応していますが、 それ以前は対応していないため、以下のようなマイグレーションエラーになります。

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'json

対応策としては、jsonをテキスト型のVARCHARにするなどの変更が必要です

Mysqlのバージョンが問題ないか、jsonエラーが解決されたら マイグレーションを実行

rails db:migrate

rails5の場合

app/assets/javascripts/application.js へ以下を追加

//= require ahoy

rails6の場合

yarn add ahoy.js

app/javascript/packs/application.js へ以下を追加

import ahoy from "ahoy.js";

track_actionを追加する

全体に適用する場合はApplicationControllerへ追加する

class ApplicationController < ActionController::Base
  after_action :track_action

  protected

  def track_action
    ahoy.track "Ran action", request.path_parameters
  end
end

もちろん対象のControllerへ設定する場合は以下のような感じでも動作する

# frozen_string_literal: true

class ArticlesController < ApplicationController

  after_action :track_action


  private

  def track_action
    ahoy.track "Ran action", request.path_parameters
  end
end

上記の状態でサイトを閲覧すると以下のahoyvisitテーブルとahoyeventテーブルにデータが格納されます

ahoy_visitsでは以下のようにUUIDが生成されます

id visit_token visitor_token
1 4d83c3fb-d67b-4906-8857-75631adfc2d7 8e2219e3-74ba-4e6c-8010-69fd5a4b875d

ahoy_eventsは以下のような形で、画面遷移毎にレコードが生成されます。

id visit_id name properties
1 1 Ran action {:controller=>"articles", :action=>"index"}
2 1 Ran action {:controller=>"articles", :action=>"show"}

以下のように自動で各Modelが生成されているので、情報の呼び出しも容易に行えます。

class Ahoy::Visit < ApplicationRecord
  self.table_name = "ahoy_visits"

  has_many :events, class_name: "Ahoy::Event"
  belongs_to :user, optional: true
end
class Ahoy::Event < ApplicationRecord
  include Ahoy::QueryMethods

  self.table_name = "ahoy_events"

  belongs_to :visit
  belongs_to :user, optional: true
end

例えば、以下のように複数ページへ遷移しているユーザーを Modelから呼び出す事も可能なので、 scopeなどで呼び出す事も可能

Ahoy::Visit.find(1).events

=> #<ActiveRecord::Associations::CollectionProxy [#<Ahoy::Event id: 1, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"index\"}", time: "2020-01-15 04:50:57">, #<Ahoy::Event id: 2, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"show\", :id=>\"8...", time: "2020-01-15 04:56:05">, #<Ahoy::Event id: 3, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"show\", :id=>\"8...", time: "2020-01-15 04:57:13">, #<Ahoy::Event id: 4, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"show\", :id=>\"8...", time: "2020-01-15 05:43:19">, #<Ahoy::Event id: 5, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"index\"}", time: "2020-01-15 06:12:23">, #<Ahoy::Event id: 6, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"index\"}", time: "2020-01-15 06:12:34">, #<Ahoy::Event id: 7, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"index\"}", time: "2020-01-15 06:13:04">, #<Ahoy::Event id: 8, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"index\"}", time: "2020-01-15 06:13:07">, #<Ahoy::Event id: 9, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"index\"}", time: "2020-01-15 06:58:20">, #<Ahoy::Event id: 10, visit_id: 1, user_id: nil, name: "Ran action", properties: "{:controller=>\"articles\", :action=>\"show\", :id=>\"8...", time: "2020-01-15 06:58:26">, ...]>

あとはABテストを行う条件を設定し、ページなどでABテストを行えるます

ページのABテストの場合などは、visit_tokenの最後の1桁で 0-8はAデザインページ

9-F はBデザインページ

などと設定すれば簡単に設定可能です

ahoyは4時間ユーザーがアクセスしないと新規ユーザーとしてUUIDを新規発行します。

変更する場合はinitializers/ahoy.rbで以下のように変更すれば増減可能です

Ahoy.visit_duration = 30.minutes

また、deviceを利用している場合は イベントトラッキング用gem ahoyで、deviseの複数のユーザモデルを取り扱うが分かりやすかったです。

以上になります

その他関連記事

Ruby on RailsとGoogle Geocoding APIで住所から緯度・経度を取得する方法

Gemを利用せずRailsで画像をDBに投稿する

Ruby on Rails でデータを取得するメソッド一覧

Ruby on Railsのscopeメソッドで検索を効率化する

Ruby on Rails5でMariaDBを利用するfor mac

SEOは「キーワード選定」が超絶肝!知らないとマジでやばい「開封率の法則」とは!?

前の記事
次の記事
人気記事
カテゴリーから記事を探す