【Rails】active_hashを使う!

フリマアプリを制作中で、active_hashを使用する機械があったので備忘録として残しておきます。これから実装する方の参考になれば幸いです。

active_hashとは?

わざわざテーブルを作成しなくても、読み込み専用情報をまとめたハッシュを扱うことができるものです。テーブルを持つほどでもない、静的なデータ(都道府県情報など不変なもの)を扱う時には便利です。 DBに変動が起きないデータをmodelに保存している場合、すぐ入れ替えることが可能でgemを導入して使用します。

導入

gemをbundleinstallします。

gem 'active_hash'
モデル(擬似モデル)を作成する

モデルを作成しますが、「rails g model~」を使用しないでモデルを手動で作成します。maigrationファイルでカラムの設定等をしない。ここが擬似モデルと言われる理由だと思います。今回はmodelに直接ファイルを作成する方法が紹介されている方法を使用します。
①appのmodelフォルダに移る
②modelフォルダ内に作成したい名前でモデルファイルを作成する
gyazo.com

モデル内の記述

①自分でモデルファイルを作成したので、当然中身は何もありません。「ActiveHash::Base」を継承して下記のようにクラスを設定します。

class Shipping < ActiveHash::Base

end

②モデル内に呼び出す静的データを記述します。
{カラム名: 値, カラム名:値}をハッシュ形式で作成しています。都道府県等どれだけ多い情報でも同様の記述で対応が可能です。

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

③アソシエーションを組む
アソシエーションを組む時は通常とは少し違っているので注意が必要です。記述場所はそれぞれのmodelファイルで問題ありません。

1, has_manyの場合(今回はproducts.rbとアソシエーションを組んでいます)

include ActiveHash::Associations
has_many :products

2, belongs_toの場合

extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to_active_hash :shipping
viewファイルに記述する

viewファイルにcollection_selectを使って呼び出すようにします。書き方は下記の通りです。
1、「shipping_id」: form_withで送信先で登録されるレコードのカラム名を指します。
2、「shipping.all」: 擬似モデルの全ての情報を呼び出しています。
3、 {include_blank: "○○"} : セレクトボックスの中に文字列を表示させる事ができます
4、「:id, :name」 : 表示させるidとnameらしいですが、書き方として覚えてます。
5、「{class: '〇〇'}」 : クラスを設定する時は{}をつけるようにします。

= form.collection_select :shipping_id, Shipping.all, :id, :name, {include_blank: "選択してください"}, {class: '〇〇'}

gyazo.com

その他の設定

①active_hashはform_withと一緒に使っていると思うのでコントローラー上でストロングパラメーターの設定が必要です、カラム名は「shipping_id」とします。
gyazo.com

②form_withで送信された内容が保存されるテーブルにカラム名(shipping_id)を追加します。
擬似モデルで設定したid番号が入るようになります。
gyazo.com


これでactive_hashを使用して情報が送信されるようになりました!

参考サイト

github.com

pikawaka.com