ActiveHashまとめ


　　
## そもそもActiveHashとは
ActiveHashは都道府県など、テーブルを作るほど価値はないけどHTMLに直接書くのはちょっと・・・
みたいな情報をModelファイルに直接記述して、データーベースにテーブルを作ったときと同じように
扱えるGemです。
　　

## 導入方法
まずはGemをインストールしましょう。

```ruby:Gemfile
gem 'active_hash'
```

```
% bundle install
```
<br>

## モデルファイルを作る
ActiveHashではapp/modelsディレクトリの中にmodelファイルを作成するのですが
通常のrails g modelコマンドは使いません。

[![Image from Gyazo](https://i.gyazo.com/2d6725503e452639b0bdbe1c2943cd72.gif)](https://gyazo.com/2d6725503e452639b0bdbe1c2943cd72)

どうしてかというとActiveHashでは通常のModelのようにApplicationRecordを継承せず
ActiveHash::Baseを継承するからです。
余計なファイルを作成しないためにも、直接modelsディレクトリにファイルを作成しましょう。

そして作成したファイルには

```ruby:prefecture.rb
class Prefecture < ApplicationRecord
end
```
ではなく

```ruby:prefecture.rb
class Prefecture < ActiveHash::Base
end
```

と記述します。

　　

## モデルファイルに情報を記述する

### ・ActiveHashの定義方法

```ruby:モデルファイル
class モデルクラス名 < ActiveHash::Base
  self.data = [
      {カラム名: 値, カラム名: 値}
  ]
end
```

self.dataの中に配列を作り、ハッシュを入れてデータを入れます。
<br>

都道府県のデータを入れてみると、

```ruby: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
```

と","で区切って{id: 1, name: '北海道'}, {id:2, name: '青森県'}と情報を入れていきます。

<br>
### ・３つ以上のデータ登録
基本はidとnameで記述することが多いかと思いますが
国名などでアルファベットとカナを入力したいという場合もあると思います。
その場合はテーブルにカラムを追加するイメージで

```ruby:country.rb
class Country < ActiveHash::Base
  self.data = [
    { id: 1,  name: 'ーー', name_kana: 'ーー'},
    { id: 2,  name: 'France', name_kana: 'フランス'},
    { id: 3,  name: 'Italy', name_kana: 'イタリア'},
    { id: 4,  name: 'German', name_kana: 'ドイツ'},
    { id: 5,  name: 'Spain', name_kana: 'スペイン'},
    { id: 6,  name: 'Portugal', name_kana: 'ポルトガル'},
    { id: 7,  name: 'New Zealand', name_kana: 'ニュージーランド'},
    { id: 8,  name: 'Australia', name_kana: 'オーストラリア'},
    { id: 9,  name: 'Chile', name_kana: 'チリ'},
    { id: 10,  name: 'Argentina', name_kana: 'アルゼンチン'},
    { id: 11,  name: 'Japan', name_kana: '日本'}

  ]
end
```

と、ハッシュの中で","で区切ってあげると増やすことができます。
<br>

### ・マイグレーションファイルに記述する

マイグレーションファイルにはinteger型で登録します。

```ruby:202103150321_create_qiita.rb
class CreateQiitas < ActiveRecord::Migration[6.0]
  def change
    create_table :wines do |t|
      t.string  :name,           null: false
      t.string  :name_kana,      null: false
      t.integer :country_id,     null: false
      t.timestamps
    end
  end
end
```

追加で登録する場合は

```ruby:2021049193123_add_column_to_qiita.rb
class AddColumnToWines < ActiveRecord::Migration[6.0]
  def change
    add_column :qiitas, :country_id, :integer
  end
end
```

で登録します。
　　

## アソシエーションを組む

アソシエーションは通常のモデルファイルとは異なり、アソシエーションを組む側だけに記述するだけで大丈夫です。

```ruby:wine.rb
extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :country
```

と記述します。

アソシエーションを組むことにより、
通常のモデルと同じように情報を取り出すことができます。

```ruby:index.html
@wines.each do |wine|
　<%= wine.country.name_kana>
end
```



またformタグでは

```ruby:
<%= form.collection_select(:country_id, Country.all, :id, :name_kana,{include_blank: "---"} ) %>
```

と記述するとcounty.rbのカナで登録された情報がセレクトボックスで表示することができます。

<br>



## まとめ
変更することが考えられるのであれば、通常のテーブルを作成。
固定の内容であればActive Hashのモデルの中にさまざまな情報（数字だったり）を入れていくと便利でいいかなと思います。