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