ActiveHashを使う
仕事でActiveYMLを使う、と言われたので、なんのことやら状態から少し調べる。
ActiveHashというgemを用いて、DB及びモデルの拡張を行うようなイメージ?
参考にさせていただいたサイトさんでは、例えば商品マスターデータに種別のidだけ持たせて、種別の情報自体はActiveHashとして(DBにテーブルや列は作らずに)参照可能とするような使い方を紹介されていた。
DBに登録するまでもないような情報だけど、ActiveRecordと一緒に使いたい、みたいな時に有用らしい。
ActiveYMLは、ActiveHashを使ったときに該当のモデル(ActiveHashを継承したモデル)の定義内にデータを書くのではなく、ymlファイルとして別に切り出しましょう、という使い方。
- gemの設定
gem 'active_hash'
- modelの作成
class Hoge < ActiveHash::Base self.data = [ {id: 1, name: 'ほげ'}, {id: 2, name: 'ふが'}, {id: 3, name: 'ぴよ'}, ] end
これで、Hogeに対してActiveRecordと同じように、allとかfirstとかで問い合わせができる。
- self.dataのymlへの切り出し self.dataの部分をymlファイルに切り出すときは以下。
- id: 1 hoge_type: Hoge name: 'ほげ' - id: 2 hoge_type: Fuga name: 'ふが' - id: 3 product_type: Piyo name: 'ぴよ'
Model側は以下
set_root_path "config/master" #=> ymlファイルの配置ディレクトリ set_filename "hoge_type" #=> ymlファイル名
include ActiveHash::Enum self.data = [ {id: 1, hoge_type: 'Hoge', name: 'ほげ'}, {id: 2, hoge_type: 'Fuga', name: 'ふが'}, {id: 3, hoge_type: 'Piyo', name: 'ぴよ'}, ] enum_accessor :hoge_type
呼び出すとき「enum_accessor」で設定した列名を参照すればOK。
ただ、参照時はすべて大文字にする必要がある。
参考にさせていただいたサイト:
ActiveHashを使ってRailsで区分値を扱う方法 - TIM Labs
ほげとかふがとか、やめたいんだけどほかに思いつかない。