【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
delivery_chage(発送元の地域)を例に挙げると
collection_selectタブでdelivery_chage_idを指定する。
DeliveryCharge.allでモデルファイルから全てのデータ(id :name)に
なります。
その他は見た目等はcssで設定する。
まとめ
以上、active_hashの使用方法を記載しました。データベースにカラムを追加する等の操作が不要なため、DB関連のエラーを発生させる心配はありません。ただしテーブル間のデータをやりとりする場合など、高度な操作はできないのでその点については注意が必要です。