考えすぎてしまう人のブログ

いつも考えすぎてしまう僕の脳内を垂れ流します

【rails 5.1】DBに依存しない静的なデータはわざわざテーブルを作らず、belongs_toやhas_manyも使えるactive_hashを使うと良い

基本的に変更されないデータ

例えば都道府県名一覧だとか、カテゴリだとかそういうものを扱いたいときって悩みますよね

DBに保存しちゃえば早いし楽だけど明らかに保存する必要のないデータですし

かといってヘルパーとかにザーッと書いちゃうのもMVCの観点からあまり褒められたものじゃありませんし

そういう時に妥協案としてenumを使う時があるのですがそれはそれで単純に文字列を1対1にするだけなので使いづらかったりします(郵便番号とかもたせられない

じゃあ定数でやるか?というのも見通しが悪くなるし非常に便利なActiverecordに乗せて使えないのでおすすめできません

TODOHUKEN = [
 1: {name: :北海道, location: [12.323245, 102.3231231]},
 .
 .
 .
]

ということでそういう悩みはactive_hashを使って解決しましょう

github.com

欠点は1つだけ。DBに関係する複雑な処理は出来ないこれだけです。使い方的にそんなことはしないので(もしするならそもそも設計を見直しましょう)特に困ることは無いと思います

active_hashの使い方

Gemfileにgem 'active_hash'を書いてbundle install

後はmodelを作って継承元をActiveHash::Baseに指定すれば終わりです

class Todohuken< ActiveHash::Base
  field :name, :location
  create :id => 1, :name => '北海道', :location => [12.323245, 102.3231231]
  create :id => 2, :name => '青森',   :location => [12.323245, 102.3231231]
  .
  .
  .
end

これはmodelと同じように使えるのでTodohuken.allは勿論のことcurrent_user.todohuken.nameなどのrelationも使えます

※arrow記法は:hoge => 123を使うこと。hoge: 123を使うとエラーが出る

個人的な使い方

新しいサイトを作るときには一旦active_hashで仮置きして片っ端から仮modelを作ってしまうようにしています

そうすると作成中に発生するあ、このカラムも付けたほうが良いなによるmigrationファイルの難読化を避けられますし、仮置き部分のコードは完成品と同じものになるので後で直す必要もなくモチベーションも維持しやすいです