13note.

なんか調べたりまとめたり感想言ったりする語彙力不足及び眠気と戦うブログ

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ファイル名
  • enumとして使いたいとき
    要はHoge::FUGAみたいにしたら、固定値として参照できるようにする場合は、Modelに以下を追加する。
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

ほげとかふがとか、やめたいんだけどほかに思いつかない。