読者です 読者をやめる 読者になる 読者になる

ちーくんのブログ

プログラミング備忘録

active_hashを使って静的データやマスタデータを持つ

こんにちは。本日はactive_hashについてです。

active_hashはマスタデータや静的データを持つにはもってこいのGemで、最近Railsアプリに導入している人や企業も増えているようです。

active_hashとは

active_hashはデータをhash形式で取り扱うことができ、擬似的にActiveRecordのように取り扱うことができます。

github.com


Railsでマスタデータや静的データを取り扱うとき、DBにデータを直接持つことが多いと思います。

アソシエーションを張れるので、複数のテーブルを持っている場合は便利ですよね。


しかしながら、そもそも静的データやマスタデータはあまり更新しないし、DBの管理(migrationからseedまで)がめんどくさい。。


そんなときに、active_hashが便利です。

DBを作らなくてもActiveRecordと同じようにデータを持つことができ、扱いも簡単です。


基本的な使い方

Gemでインストールしてから、マスタデータや静的データを持ちたいモデルにデータを定義していくというのが基本です。

インストール

gem "active_hash"
$ bundle install

モデル

# app/models/country.rb

class Country < ActiveHash::Base
  self.data = [
    {:id => 1, :name => "US"},
    {:id => 2, :name => "Canada"}
  ]
end


あとはフォームを表示したいところに書く。

<%= f.collection_select :country_id, Country.all, :id, :name %>


viewやデータ定義は以上が基本的なことになります。


アソシエーション

active_hashが便利なところはアソシエーションを簡単に張れることです。

# 1対多

class Country < ActiveHash::Base
end

class Person < ActiveRecord::Base
  belongs_to :country
end

※ActiveRecordのバージョンによって書き方が一部異なるようです。

# 多対多

class Country < ActiveHash::Base
  include ActiveHash::Associations
  has_many :people
end

class Person < ActiveHash::Base
  include ActiveHash::Associations
  belongs_to :country
  has_many :pets
end

class Pet < ActiveRecord::Base
end


ActiveRecordのようにデータを扱うことができるので、アソシエーションも簡単にできて便利ですね。


注意点

active_hashはとても便利なのですが、いくつか注意しないといけない点もあります。

検索

ActiveRecordのincludesやjoinsを使ってテーブル間の検索をするのは(たぶん)無理なので、おとなしくmigrationファイルでActiveRecordを使用したほうが良さそうです。

rails_admin

Railsの管理画面で使っている人も多いrails_adminではactive_hashが使えませんでした。(あくまで個人的にですが。。)

以下がエラー内容です。

undefined method `properties' for nil:NilClass code here

 register_instance_option :searchable do
   @searchable ||= associated_model_config.abstract_model.properties.collect(&:name).include?(associated_model_config.object_label_method) ? [associated_model_config.object_label_method, {abstract_model.model => method_name}] : {abstract_model.model => method_name}
 end 


active_hashは情報がまだ少ない上、制約もあるので、前回書いたseed-fuを使って静的データやマスタデータを持ったほうがいいかもしれません。

blog.otsukasatoshi.com


おそらく今後active_hashも改良が加えられ、使えるようになると思うので、もっと実用的になったらまた使ってみたいと思います。



本日は以上です。