active_hashについて
都道府県などの静的データはactive_hashを利用しましょう
とレビューを頂いたことから調べて実装に至りました。
その際に参考にさせていただいたサイト。
- 公式
- 【rails 5.1】DBに依存しない静的なデータはわざわざテーブルを作らず、belongs_toやhas_manyも使えるactive_hashを使うと良い
- Railsのgem 'active_hash'で都道府県データを作成してみた
- railsでactive_hashを導入する
とても分かりやすかったので導入もスムーズに行きました。
Railsにありがちな最新バージョンはよくないことあるかも、みたいな情報も助かりました。
...壊れた時のことをあまり考えてなかったので今回は最新のactive_hashを記述しましたが😅
導入した時のアプリのバージョン
5.2系は5.2.3の方がよかったのかなって思いましたが、この時は何か別のアプリで参考にしたのかな...覚えてない...
gemで用意されてるので、Gemfileに
gem 'active_hash'
上述していたアプリが壊れる可能性のことを考慮するなら、Rails5であれば
gem 'active_hash', '~> 2.3.0'
が推奨されているそうです。
Rails5未満、Ruby2.4未満の場合は
gem 'active_hash', '~> 1.5.3'
記入したらターミナルに
% bundle install
入力して実行。
実装したアプリでは、ユーザーの住所 = 出品物の配送場所とは限らない、という想定からrails g model Address
とかはしてなかったような。
そのままPrefecture.rbを手入力で作成する形としました。
class Prefecture < ActiveHash::Base self.data = [ {id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'}, {id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'}, {id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'}, {id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'}, {id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'}, {id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'}, {id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'}, {id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'}, {id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'}, {id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'}, {id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'}, {id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'}, {id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'}, {id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'}, {id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'}, {id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'} ] end
ActiveHash::Baseを継承したモデルを作成するとActiveRecordのメソッドが使用できるとのこと。
active_hashを使用した時以外でも打ってみたことがありますが、
[1] pry(main) > % Prefecture.methods
のようにすることで使用できるメソッドの一覧をターミナルで確認できます。
今回使用したのは割とよく使われるメソッドですが、
= f.collection_select :ship_area, Prefecture.all, :id, :name, prompt:'---'
のような.all
だったりを使用してPrefectureモデルをベースにセレクトボックスを生成することができる、ってわけですね。便利!
DB内容を操作するような複雑な処理には適さないそうです。 その場合は、素直にテーブルを用意するか、enumはどうかな...?どちらにしろ、別の適した形で対応するのが望ましそうですね。
別記サイトでも書いていましたが、Addressなどと直接紐づけるなら
class Address < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to_active_hash :prefecture end
のように、belongs_to_active_hash :[model名]
でアソシエーションを組むことができる。
ただしこの時、extend ActiveHash::Associations::ActiveRecordExtensionsしないとprefectureモデルは使えない。
詳細は公式GitHubのrepositoryにありますね。
今のところ利用する為の根本?bundleやgemについてはまだよく理解できいませんが、このように定義されているmoduleからどう言う処理をさせるか書いてるんですね〜。すげーなー。
他に不変的なデータとかって言うのは国名とか生年月日とかでしょうか?
enumもそうですが、単純にモデル作成 = データベース設計&作成、をしなくてもいいのでとてもありがたい機能。
今回はここまで。
したらな❗️ 👋