ActiveHashの導入

#はじめに

![スクリーンショット 2021-06-16 19.18.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/eb4b36ee-4937-2017-8b1a-308356224740.png)


オリジナルアプリの作成中**ActiveHash**を導入したいので忘れないためにアウトプットしていきます。

##ActiveHashとは

ActiveHashとは、変更されないデータで
変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。

- 頻繁に変更されることがない

- DBに保存するほどではない


例えばネットショッピングなど住所を書く際に、よくプルダウンで都道府県を選ぶ時があります。ユーザに記入してもらう事も出来ますが、絶対に都道府県が47しかありませんので書かせる手間を省く事が出来ます。

#導入

まずは**Gemfile**に下記のように記述します。

```ruby:Gemfile
# '' シングルクォーテーション忘れずに！！
gem 'active_hash'
```

ターミナルで**`bundle install`**を入力して導入完了です。

##モデル作成

itemというモデルを作成します。
`rails g model item`

###ActiveHashのモデル作成

モデルを作成する際,`rails g model ~`で作成されると思いますが、今回は直接ファイルを作成して下さい。

都道府県のモデルなので*region*モデルを作成しました。

このようなディレクトリーになると思います。
app>models>profession.rb

###データを記述

作成したモデルの中に早速記述していきます。

```region.rb
class Region < ActiveHash::Base

end
```

**ActiveHash::Base**
ActiveHash::Baseは、あるモデル内でActiveHashを用いる際に必要となるクラスです。ActiveHashのGemに定義されています。
また、ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用できるようになります。

クラスができたら早速データを記述します。
データは、配列にハッシュ形式で格納しています。

```region.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
```

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

Itemテーブルの中にregion_idという名前のカラムを作成しているのは、登録の際に、そのitemに紐付いた都道府県を取得するためです。
Itemテーブルの中で、Regionモデル（ActiveHash）のidを外部キーとして管理することで、そのユーザーに紐付いた職種の取得が実現できます。

```db/migrate/20XXXXXXXXXXXX_items.rb
class CreateItems < ActiveRecord::Migration[6.0]
  def change
    create_table :items do |t|

      t.string     :name, null: false
      t.text       :text, null: false
      t.integer    :category_id, null: false
      t.integer    :status_id, null: false
      t.integer    :postage_id, null: false
      t.integer    :region_id, null: false
      t.integer    :shopping_date_id, null: false
      t.integer    :price, null: false
      t.references :user, foreign_key: true
      t.timestamps
    end
  end
end
```
記述できたら**`rails db:migrate`**していきます。

###アソシエーションの設定

次にitemモデルにアソシエーションを設定します。
itemモデルには1つのregionが紐付いています。

```item.rb
class Item < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :region
end

```

###バリデーションの設定

```item.rb
class Item < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :region
   
  validates :region_id, numericality: { other_than: 1 } 
end

```

**numericality**
数値のみかを検証するバリデーションの一種です。
数値であればデータベースに保存され、それ以外では保存されません。
また、オプションで`other_than:1`にする事で1保存できなくしました。

###ビューに表示

```erb: 
<%= f.collection_select(:region_id, Region.all, :id, :name, {},  %>
```

```erb:
<%= f.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目, 選択肢に表示されるカラム名, オプション, htmlオプション) %>
```

このような記述でプルダウンして表示されるようになります。