DBに保存するほどでもないマスターデータをどのように管理するか悩んだことはありませんか?
今回は、そんな時に便利かも!?な ActiveHash
を使ってモデルライクにマスターデータを管理します。
事前準備
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.category
や category.foods
のように使うことができます。
終わり
複雑なアソシエーションを追加する必要がある場合は多用しない方がいいですが、ちょっとしたマスターデータを作りたい時には重宝しますね!