active hash でセレクトボックスをつくる

# １　active hashとは
某フリマサイトを作成する際に、active hashというgemを使ってセレクトタグを作成しました。
active hashは都道府県などデータベースを作成するほどではなく、かつ変更される可能性が低いデータを扱いたい時に便利なgemです。
ハッシュを使ってアクティブレコードのモデルのように扱えるファイルを作成できます。


\<gemのリンク>
>https://github.com/zilkey/active_hash

READMEの記述
>ActiveHash is a simple base class that allows you to use a ruby hash as a readonly datasource for an ActiveRecord-like model.



# 2　使い方

### 1) gemのインストール
まずは**gemfile**に以下のコードを記述して**bundle install**します。

```
gem 'active_hash', '~> 2.3.0' 　←2020/04/03現在のバージョン
```

###2) モデルの作成
app>modelsの中に直接ファイルを作成します。
注意： **rails g model** は使わない


今回は都道府県のactive hashを作成するため**prefecture.rb**という名前でファイルを作成します。



ファイルの中身の書き方は以下の通りです。


```
class Prefecture < ActiveHash::Base
  self.data = [
　　　 {id: 0, name: '選択してください'},
      {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
```
### 3)　アソシエーションを組む　＆　バリデーションをかける（任意）

a)　アソシエーションを組む
active_hashにはbelongs_to_active_hashメソッドが用意されているのでaddressモデルに記述します。
※active hashの方には記述する必要はありません。


b)　保存するデータベースにバリデーションをかける
今回はユーザー登録の際に必ず都道府県を入力させたいので、addressモデルにバリデーションをかけます。

```address.rb
extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :prefecture
  belongs_to :user, optional: true
  validates :prefecture, presence: true   ←この記事に関係ないカラムは省略してます
```



以上です。
簡単ですね。




# ２　viewにactive hashからデータを持ってくる
active hashを使いたいビューページに以下の記述をします。

```
= f.collection_select :prefecture_id, Prefecture.all, :id, :name　

```
\<記述内容の解説>
第一引数：登録するデータベースのカラム名
第二引数：作成したactive hashからどのようにデータを持ってくるかを指定
第三引数：paramsで送るデータを指定（:nameでも可能　※dbのカラムはstringにしましょう。）
第四引数：ユーザーが見れるセレクトタグの内容
※今回はcollection_selectの説明は割愛します。
<br>
<br>
なお今回は、都道府県を記入させるタイミングが二回あり、二度目の発送元の記入では-未定-を選べるためactive hash内に記述しましたが、ユーザー登録では-未定-は使いたくないためそれ以外を引き出します。

```
= f.collection_select :prefecture_id, Prefecture.where.not(name: '未定'), :id, :name

```

# ３　完成写真
<img width="300" alt="" src="https://i.gyazo.com/4fab25ff8f0c7456c6994a1fa5bd77e4.png">  <img width="300" alt="" src="https://i.gyazo.com/27c24d5831d52a96bc20d93d8860e478.png">


# ４、注意

formを使うと自動でidが割り振られるので、cssを当てる時は検証ツールを使ってidを確認しましょう。
<img width="500" alt="" src="https://i.gyazo.com/1f98fb7f107364d5fbc82de8b3a81f43.png
">

<br>
<br>
以上です。最後までご覧いただきありがとうございました。
<br>