むじんブログ ”3歩進んで2歩下がる”

37歳未経験からのエンジニア転職を目指す営業部長

ActiveHashについて

最終課題実装中に学んだ内容。

 

【ActiveHash】

都道府県のように、基本的に変わらないデータを取扱う際に用いる。

・データが変わらないのでDBに保存する必要はない

・一方で、ビューファイルに記述するには可読性に欠ける

ようなときに使うと良い。

 

ActiveHashはGemの1つで、上記のデータをモデルファイルに記述する。

この記述に対しては、ActiveRecordメソッド(allやcreateなど)を使うことができる。

 

【使い方】

Gemfileにgem 'active_hash'を追記して、bundle installを実行。

対象のモデルに対して、設定したいデータを下記のように記述。

 

1行目の記載は、ActiveHash::BaseをGenreモデルで継承するという意味。

あるモデルにActiveHashを記述するとき、この継承が必要となる。

また、継承することでActiveHash内でActiveRecordメソッドが使えるようになる。

(ActiveHash::BaseはActiveHashのGem内で定義されている)

 

 

 

【アソシエーションの設定】

ActiveHashを用いてアソシエーションを設定する場合には、モジュール(module)を活用した特殊な記述が必要となる。

モジュールはActiveHashで定義されており、それをモデルに取り込む形をとる。

※モジュールとはメソッドをまとめているもので、取り込んで使用するという程度の理解で今は良いらしい。

 

↓今回はarticleモデルとgenreモデル間でのアソシエーション。

 

 

↓genreモデル側の記載は下記。

 

【numericality】

バリデーションの1つで、数値かどうかを検証する。

今回は、プルダウンの「--」が選択されている場合はデータベースに保存させないようにするために、下記のようにした。

(genre_id1が「--」なので、それを除くという記述)

 

 

【コントローラー作成時のビューファイル同時作成】

コントローラー作成時にビューファイルも同時に作成できるが、

下記のように2つ指定することもできる。

 

【プルダウンの作成】

プルダウンの作成は、6行目のf.collection_selectを用いる。

 

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

・第一引数

genre_id→モデルで記述したActiveHashのidの値が、カラムのどこに入るかを指定した記述(例えばITを選択すると、genre_idに6という値が保存される)。

 

・第二引数

Genre.all→プルダウンリストを参照する記述。Genreモデルに記載されているActiveHashが、ActiveRecordのallによって全て参照される。

 

・第三引数

:id→カラムに保存される項目(今回であれば6になり、モデルでITが6であると指定している)

 

第四引数

:name→実際にプルダウンに表示されるもの(今回はジャンル名)

 

第五引数

{}→今回は中が空だが、必要な場合にオプションを記述することができる。

 

第六引数

{class:"genre-select"}→htmlオプションを記述することができる。

(今回はCSSを適用させるためにクラス名を付与している)

 

↓これで下記のようにプルダウンが作成できる。

 

マイグレーションファイルを伴わないモデルの作成】

最終課題では、下記サイトを参考にActiveHash用にモデルのみの作成をした。

rails g model category --skip-migration

qiita.com