🍟

ActiveHashの概要と使用法

2022/02/18に公開

Active_Hashとは

Active_Hashとは、Ruby on RailsのGemのひとつです。
データベースなしで実行される単純なテストクラスを作成する場合に、ActiveRecordのようなメソッドを用いることができます。
例えば、選択式で都道府県や記事のジャンルが選べるような実装を行う際に役に立ちます。

インストールの仕方

  • gemfileに以下を記述
gem 'active_hash'
  • ターミナルでコマンド実行
% bundle install

具体例

1. モデルの作成

OrderモデルとRegionモデル(クラス)を作成します。

ターミナル

% rails g model order

Regionモデルは直接app/modelsディレクトリ配下にregion.rbを作成します。

また、「Regionクラス」内にActiveHash::Baseクラスを承継します。

Regionモデルに定義したデータは、配列にハッシュ形式で格納していきます。
今回はid: 1---として、未選択の状態が起こるようにしています。

app/models/prefecture.rb
class Region < 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: '鹿児島県' }, { id: 48, name: '沖縄県' }
  ]

end

2. マイグレーションファイルの編集

Orderモデルを以下のように編集します。
Regionモデルのidを外部キーとして管理します。

db/migrate/20XXXXXXXXXXXX_create_order.rb
class CreateOrders < ActiveRecord::Migration[6.0]
 def change
   create_table :orders do |t|
     t.integer :region_id, null: false
     t.timestamps
   end
 end
end

この時、idの番号を選択するようになるので、カラムの型はintegerを指定します。

編集ができたら、データベースに反映します。
ターミナル

% rails db:migrate

3. アソシエーションの設定

OrderモデルとRegionモデル間でアソシエーションを設定します。

ActiveHashを用いて、belongs_toを設定するには、
extend ActiveHash::Associations::ActiveRecordExtensionsと記述してmoduleを取り込みます。

app/models/order.rb
class Order < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :region
end

ActiveHashを用いて、has_manyを設定するには、
include ActiveHash::Associationsと記述してmoduleを取り込みます。

app/models/region.rb
class Region < ActiveHash::Base
  
  ・・・省略・・・

  include ActiveHash::Associations
  has_many :orders

end

4. バリデーションの設定

Orderモデルにバリデーションを設定します。
これは、id:1が未選択であるという状態にしているため、id:1以外の時に保存可能という意味です。

app/models/order.rb
class Order < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :region

+ validates :region_id, numericality: { other_than: 1}
end

5. ビューの設定

collection_selectメソッドを使って、データをプルダウン形式で表示し、下記のような順番で記述します。

【例】

<%= form.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目, 選択肢に表示されるカラム名, オプション, htmlオプション) %>
app/views/order/new.html.erb
<div class="weight-bold-text">
  発送元の地域
  <span class="indispensable">必須</span>
</div>
<%= f.collection_select(:region_id, Region.all, :id, :name, {}, {class:"select-box", id:"item-prefecture"}) %>

第二引数のRegion.allで配列内のデータを全て呼び出しています。

参考

ActiveHashソースコード

Discussion