【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: '〇〇'}