平凡エンジニアによる平凡ブログ

平凡インフラエンジニアがスキルアップを目指してプログラミングやクラウドやサーバといったインフラのアウトプットをしていきます!

【rails】active_hashの実装について

今回は「active_hash」の実装について記載します

はじめに

まずはactive_hashとは公式ページの英語から少しかいつまんで以下のような 説明にします。

ハッシュをデータベースに保存できるgemです。
データベースの外部キーを変更せずにActiveRecoreと同じようにデータとして
使うことができます。

公式ページは以下の通りです
https://github.com/zilkey/active_hash

基本的に都道府県などデータに変化がないデータをDBに保存せずに使用したい場合に実装することが多いです。
(都道府県は日本で言うと基本47都道府県から変更はない)

のちに説明するが、ハッシュデータを作成して、それをDBに保存するだけなので マイグレーションファイルを作成して改めてDBの構造を変更する必要はない

DBの構造等に影響は与えないのでエラーを検出する可能性も減らせることができるので、使用できるなら使用した方がいいと考えます。

環境

macOS Mojave 10.14.6 ruby 2.5.1 rails 5.2.4.1

手順

1.Gemfileにactive_hashを記載しbundle installをする

gem 'active_hash'

2.activ_hashを使用するためにモデルに設定を行う(データを使用する側)
今回は商品(item)にare(都道府県)とshipping_date.rb(発送日時)のハッシュデータを登録できるようにする。
ここではデータを使用する側であるitem(商品側)の実装方法についてです。

 class Item < ApplicationRecord

  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :shipping_date
  belongs_to_active_hash :area
end

※前提であるrails g model itemやマイグレーションなどの作成については割愛
「extend ActiveHash::Associations::ActiveRecordExtensions」を使い active_recoreを継承させることで 「belongs_to_active_hash」メソッドが 使用することができます。

3.ハッシュを登録するテーブル側の設定(データを保存する側)
今度はハッシュデータを保持するare(都道府県)とshipping_date.rb(発送日時)側の設定についてです。

まずハッシュデータを記載するモデルを作成します。

ここで重要なことが「rails g model〜」でモデルを作成するのではなく
必ず手動(該当フォルダを右クリックしてファイル作成等)でモデルのファイルを作成してください。

area.rb

class Area < ActiveHash::Base
  self.data = [
      {id: 1, name:'北海道'}, 
      {id: 2, name:'青森県'},
  ~(以下同様に設定してください)  
  ]
end

shipping_date.rb

class ShippingDate < ActiveHash::Base
  self.data = [
      {id: 1, name: '1~2日で発送'},
      {id: 2, name: '2~3日で発送'},
      {id: 3, name: '4~7日で発送'},
  ]
end

idとnameデータをハッシュとしてそれぞれ保存しています。

4.実際にフロントに表示させる
※viewを抜粋します。あくまで例です。

= form_for @item do |f|
.form
        .form_space
         = f.collection_select :area_id, Area.all, :id, :name

   .form
        .form_space
         = f.collection_select :delivery_charge_id, DeliveryCharge.all, :id, :name

Image from Gyazo

delivery_chage(発送元の地域)を例に挙げると
collection_selectタブでdelivery_chage_idを指定する。 DeliveryCharge.allでモデルファイルから全てのデータ(id :name)に なります。 その他は見た目等はcssで設定する。

まとめ

以上、active_hashの使用方法を記載しました。データベースにカラムを追加する等の操作が不要なため、DB関連のエラーを発生させる心配はありません。ただしテーブル間のデータをやりとりする場合など、高度な操作はできないのでその点については注意が必要です。