もふもふ技術部

IT技術系mofmofメディア

【Rails】ActiveHashでマスターデータを管理する

DBに保存するほどでもないマスターデータをどのように管理するか悩んだことはありませんか?
今回は、そんな時に便利かも!?な ActiveHash を使ってモデルライクにマスターデータを管理します。

github.com

事前準備

Gemをインストールする

Gemfile

gem 'active_hash'
マスターデータを用意する

今回はカテゴリーを管理します。

ID カテゴリー名
1 野菜
2 果物
3 お肉
4 穀物

ActiveHash のモデルに直書きする場合

app/models/category.rb
class Category < ActiveHash::Base
  self.data = [
    { id: 1, name: "野菜"},
    { id: 2, name: "果物"},
    { id: 3, name: "お肉"},
    { id: 4, name: "穀物"},
  ]
end

yamlファイルで管理する場合

app/models/category.rb
class Category < ActiveYaml::Base
  set_root_path Rails.root.join('config', 'active_yamls')
  set_filename "categories"
end
config/active_yamls/categories.yml
- id: 1
  name: 野菜
- id: 2
  name: 果物
- id: 3
  name: お肉
- id: 4
  name: 穀物

使い方

モデルを操作するのと同じように使うことができます。

Category.all
#=> [#<Category:0x0000ffff7b547d80 @attributes={:id=>1, :name=>"野菜"}>,
 #<Category:0x0000ffff7b547a10 @attributes={:id=>2, :name=>"果物"}>,
 #<Category:0x0000ffff7b547880 @attributes={:id=>3, :name=>"お肉"}>,
 #<Category:0x0000ffff7b5476f0 @attributes={:id=>4, :name=>"穀物"}>]

Category.first
#=> #<Category:0x0000ffff7b547d80 @attributes={:id=>1, :name=>"野菜"}>

Category.find_by(name: "お肉")
#=> #<Category:0x0000ffff7b547880 @attributes={:id=>3, :name=>"お肉"}>

他のモデルと紐付ける

例えば、 Food というモデルがあり Category を紐付けたくなったとしたら以下のように実装します。

app/models/food.rb

class Food < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :category
end

app/models/category.rb

class Category < ActiveHash::Base
  set_root_path Rails.root.join('config', 'active_yamls')
  set_filename "categories"

  include ActiveHash::Associations
  has_many :foods
end

モデルを操作するのと同じように food.categorycategory.foods のように使うことができます。

終わり

複雑なアソシエーションを追加する必要がある場合は多用しない方がいいですが、ちょっとしたマスターデータを作りたい時には重宝しますね!