[RubyOnRails] active_hashはどんなデータに使うべきなのか


はじめに

Railsでアプリケーション開発を行う際に、ある程度実世界に存在するであろうレベル間のフォームを実装しようとすると必然的にactive_hashの存在にたどり着くと思います。

僕もまんまと辿りつき「便利やな〜」って思ってたんですが、色々作業を進める内に使うべき時とそうじゃない時の考え方が少しずつ定まってきたので、備忘として残しておく物です。

環境

以下の環境で行っています。

ruby 2.6.5
rails 6.0.3

active_hashを使うべきデータ

結論からいうと以下の考え方でいいのかなと。
①あまり重要ではないデータに使う
②静的なデータに使う
③複雑な構造を持たないデータに使う

結論から言うと上の二つだよねって感じでどこにでも書いてあるのですが、僕は②の認識が甘かったり、③をそもそも考えてなかったりだったなーと開発を進めてく中で学んでいった形です。詳しくは後述します。

そもそもactive_hashとは

こちらの記事こちらの記事が非常にわかりやすいです。おかげさまであまり困らず導入できました。(いつもいつも先人には頭があがりません)

gem active_hashを利用することで、テーブルを作らなくともアクティブレコードの様に使える静的データを作っておくことが出来るというもの。
(ちなみにgemの最新バージョンは許容する記載方法が減っているとのことで導入時には注意が必要です)

よく例に出されるのだと都道府県データとかがありますね。実際に記載すると以下の様になります。

prefecture.rb
class Prefecture < ActiveHash::Base
  self.data = [
      {id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
      {id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
      {id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
      {id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
      {id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
      {id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
      {id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
      {id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
      {id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
      {id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
      {id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
      {id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
      {id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
      {id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
      {id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
      {id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
  ]
end

modelの中にこの様なファイルを作るだけです。非常にシンプル。id:やname:がテーブルでいうカラム名ですね。
あとはアソシエーションをactive_hash用の記載で書いておくだけで簡単に使えます。

item.rb
class Item < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :prefecture
end

今回はitemテーブルにprefecture_idを持たせたかったので、モデルに上記の様に記載します。
アクティブハッシュ側にはアソシエーションの記載は不要です。
これでテーブルを作った場合とある程度同様に使える様になります。お手軽で便利。

静的なデータ、複雑じゃないデータって?

静的なデータ

静的なデータと聞いて、僕は最初クライアントサイドが増やさず、サーバーサイドで用意しておくデータくらいの認識でいました。

ただ、進めてる内にこの認識は不十分だなーと思って行った次第です。
具体的にいうと、例えサーバーサイド側で用意しておくデータであろうと、それが使用変更でどんどん増えて行ったり、後から値が変わる様なものならそれは静的とは言えないな、と

上記の書き方を見ても分かる通り、アクティブハッシュの各値はファイルにベタ内なので、これの更新行為ってめんどいやらリスクあるやらなんですよね(アナログ作業)

そこまで考えて、active_hashの使用例にやたら都道府県が出てくる理由をようやく理解しました。
都道府県って、クライアントサイドの都合でもサーバーサイドの都合でも増えないですもんね。

複雑なデータ

これは最初に知った時に少し思い当たる節がありました。僕は多対多のアソシエーションをくみたかったのですが、それってアクティブハッシュでは困難とのことだったので、あながち間違いじゃない認識だったんだなと。

あとは階層構造を持つテーブルとかも複雑なのでアクティブハッシュは使えないみたいですね。
そこらへんの認識が抜け落ちてました。

終わりに

「静的なデータ」と言う語の意味を正確に捉えられてなかったんだな〜と言う感想を開発を進めていく中で持った次第です。
やっぱ基本やってみないとわからないですね何事も。手を動かすあるのみ。