ActiveHash　導入方法〜表示方法

# 導入にあたりGemfileを編集

■Gemfile
```ruby
#中略
gem 'active_hash'
```

■app/modelsディレクトリ配下にファイルを作成
 例　　app/models/genre



■app/models/genreに記入
```ruby
class Genre < ActiveHash::Base
 self.data = [
   { id: 1, name: '---' },
   { id: 2, name: '経済' },
   { id: 3, name: '政治' },
   { id: 4, name: '地域' },
   { id: 5, name: '国際' },
   { id: 6, name: 'IT' },
   { id: 7, name: 'エンタメ' },
   { id: 8, name: 'スポーツ' },
   { id: 9, name: 'グルメ' },
   { id: 10, name: 'その他' }
 ]
 end
```
[解説]
・ActiveHash::Base
　　モデル内（クラス内）でActiveHashを用いる際に必要となるクラス。
　　Gem定義されている。
　　ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用が可能。

・ActiveRecordメソッドとは、モデルがテーブル操作に関して使用できるメソッドの総称）
　　ActiveRecordメソッドの一例
```ruby
Post.all
# => Postモデル（postsテーブル）の全てのデータを取得する

Post.find(2)
# => Postモデル（postsテーブル）の2番目のデータを取得する

その他、の一例
メソッド	用途
all	　　　　　　　　テーブルのすべてのデータを取得する
find	引数にレコードのidを指定し、対応するレコードを取得する
new	　　　　　　　　クラスのインスタンス（レコード）を生成する
save	クラスのインスタンス（レコード）を保存する
```

↑思い出すために少し脱線して記入。。。


■マイグレーションファイルを編集しカラム設定する
```ruby
#例
class Create　Article < ActiveRecord::Migration[6.0]
 def change
   create_table :articles do |t|
     t.string     :title        , null: false
     t.text       :text         , null: false
     t.integer    :genre_id     , null: false 　←これ
     t.timestamps
   end
 end
end
```
今回genre_idという名前のカラムを作成しているのは、
投稿した記事を表示する際に、その記事に紐付いたジャンルを取得するため。

■データベースに反映
```ruby
% rails db:migrate
```
■アソシエーション設定
ActiveHashを用いて、belongs_toを設定するには、
extend ActiveHash::Associations::ActiveRecordExtensionsと記述してmoduleを取り込む
```ruby
class Article < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :genre
end
```
■Genreモデルのアソシエーションを設定
1つのジャンルは、たくさんの投稿物に紐付いているためhas_manyを設定。
ActiveHashを用いて、has_manyを設定するには、
include ActiveHash::Associationsと記述。

app/models/genre.rb
```ruby
class Genre < ActiveHash::Base
 self.data = [
   { id: 1, name: '---' },
   { id: 2, name: '経済' },
   { id: 3, name: '政治' },
   { id: 4, name: '地域' },
   { id: 5, name: '国際' },
   { id: 6, name: 'IT' },
   { id: 7, name: 'エンタメ' },
   { id: 8, name: 'スポーツ' },
   { id: 9, name: 'グルメ' },
   { id: 10, name: 'その他' }
 ]

  include ActiveHash::Associations
  has_many :articles

 end
```
※＊その他ActiveHashを用いたアソシエーションの設定*＊
　https://github.com/active-hash/active_hash


■バリデーション設定(必要な場合)
今回は、---を保存されないように、id: 1以外保存できるように設定。

app/models/article.rb
```ruby
#　中略

validates :genre_id, numericality: { other_than: 1 } 　# ←id:1以外保存

```
[補足]
{ other_than: 1 } は{ id: 1, name: '---' }に該当し、デフォルトでブラウザ上に表示される、「まだ何も選択されていない」という意味となる。


■コントローラー設定
app/controllers/該当箇所_controller.rb
```ruby
class ArticlesController < ApplicationController
  def index
    @articles = Article.order("created_at DESC")
  end

  def new
  end
end
```

■ビュー表示
```ruby
例）
<%= form_with model: @article, url:articles_path, local: true do |f| %>
  <div class="article-box">
    記事を投稿する
    <%= f.text_field :title, class:"title", placeholder:"タイトル" %>
    <%= f.text_area :text, class:"text", placeholder:"テキスト" %>
    <%= f.collection_select(:genre_id, Genre.all, :id, :name, {}, {class:"genre-select"}) %>
    <%= f.submit "投稿する" ,class:"btn" %>
  </div>
<% end %>
<% end %>
```
[解説]
コントローラーですべての記事の情報を取得し、@articlesに代入。
eachメソッドを使い、今回はarticleという名前で記事を単一レコードとして取り出す。
今回は、ArticleモデルとActiveHashを用いたGenreモデルに、アソシエーションが組まれている。
アソシエーションが組まれている場合、単一レコード情報.ActiveHashを用いたモデル名.カラム名と記述することで、情報を取得。
※＊したがって、ジャンル名を表示する場合は、article.genre.nameと記述。*＊

ジャンル選択のプルダウンが生成
```ruby
<%= f.collection_select(:genre_id, Genre.all, :id, :name, {}, {class:"genre-select"}) %>
```
collection_selectは、下記のような順番で記述
```ruby
<%= form.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目, 選択肢に表示されるカラム名, オプション, htmlオプション) %>
```
引数、　値　、役割
・第一引数（保存されるカラム名）、:genre_id、　保存先のカラム名
・第二引数（オブジェクトの配列）、　Genre.all、　　配列データを指定する（今回はジャンル情報の配列）
・第三引数（カラムに保存される項目）、　id、　　表示する際に参照するDBのカラム名
・第四引数（選択肢に表示されるカラム名）、　name、　　実際に表示されるカラム名
・第五引数（オプション）、　{}、　　　今回はオプションの指定なし（include_blankという値のない選択肢を先頭にするオプションなど。）
・htmlオプション　　　　{class:"genre-select"}　　今回はクラス名を付与（cssを当てるため）


point:writing_hand:
 :point_up:Active_Hashとは、変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemのこと
 :point_up:ActiveHash::Baseクラスを継承すると、ActiveRecordと同様のメソッドが使用できること
 :point_up:「collection_select」とは、データをプルダウン形式で表示することができるメソッドのこと




復習兼ねて。