RailsのActiveHashを勉強したのでまとめた
今回は、学習内容そのものを整理して書き残すシリーズの第一弾です。
これまでは「勉強を通して、勉強について考える」記事を書いたりしましたが、今回はがっつりRailsの話です。
概要
ActiveHash とは、rails に用意されているgemのこと。
従来のDBで管理するモデルとは異なり、コード上で静的に管理するmodelファイルを作成し、別のモデルにアソシエートすることで、データベースの数をむやみに増やさずに固定のデータパターンを保存することができる。
(modelディレクトリにファイルを生成するが、実際にはMVCアーキテクチャにおけるモデルとは意味合いが異なるらしい。)
おもな用途
基本的に変わらないデータを使う場合に使用される。
→ たとえば都道府県など。
向かない用途
「在籍者のリスト」のような変動が多いデータの管理には、通常のモデル・DBを使用する。
僕の会社のように、毎年変わる部署名の管理などもDB管理の方が良いだろうな。
開発シーン想定(こんなアプリを作るとする)
「旅行で行った先」「旅行メモ」を保存できるアプリを作る。
memoには、行った都道府県をセットしたい。
しかし、都道府県を毎回入力するのは面倒。
誤字もなくしたいため、選択肢から選びたい。
そこで、RailsのActiveHashを使って都道府県のプルダウンリストを作りたい。
ActiveHash導入
Gemのインストール
gemfileに記述
gem ‘active_hash’
terminalでappのディレクトリに移動し、実行
bundle install
modelファイルの作成
modelディレクトリにファイルを作成
app/model/prefecture.rb
prefectures ではなく単数系にする点に注意。モデル名は単数系にする。ファイル内の記述
class Prefecture < ActiveHash::Base
self.data = [
{id:1, name:'---'},
{id:2, name:'北海道'},
{id:3, name:'青森'}
・
・
・
]
end
既存モデルへの記述
メモのモデル設定
app/model/memo.rb
class Memo < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :prefecture
end
都道府県のモデル設定
app/model/prefecture.rb
class Prefecture < ActiveHash::Base
self.data = [
{id:1, name:'---'},
{id:2, name:'北海道'},
{id:3, name:'青森'}
・
・
・
]
include ActiveHash::Associations
has_many :memos
end
※このとき、has_manyアソシエーションは通常通り、複数形のmemosで記述する。
テーブル設定
memosテーブルの設計
t.string :title, null: false
t.text :text, null: false
t.integer :prefecture_id, null: false
メモには「タイトル」と「本文」と、「都道府県ID」のデータが含まれる。
バリデーションの設定
class Memo < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :prefecture
validates :title, :text, presense: true
validates :prefecture_id, numecality: { other_than: 1 , message: "都道府県を選択してください"}
end
解説
validates :title, :text, presense: true
→タイトルが空白、本文が空白のメモを許可しない
validates :prefecture_id, numecality: { other_than: 1 , message: "都道府県を選択してください"}
都道府県IDは数字である必要がある
かつid:1 は保存しない(1は”—-”であり未選択のため)
もしエラーが出る場合は、都道府県の選択を促すメッセージを出す
ビューファイルでの呼び出し
コントローラでデータ取得・インスタンス変数へ代入
app/controllers/memos_controller.rb
class MemosController < ApplicationController
def index
@memos = Memo.order("created_at DESC")
end
def new
end
end
ビューファイルでインスタンス変数から取り出す
<h1>すべてのメモ</h1>
<%= link_to "新規作成", new_memo_path, class:"post" %>
<% @memos.each do |memo| %>
<%= memo.prefecture.name %>
<%= memo.text %>
<% end %>
解説
<% @memos.each do |memo| %>
コントローラで定義した@memosの中に格納されているそれぞれのデータを、ブロック変数であるmemoに代入しながら、一個ずつ取り出していく
<%= memo.prefecture.name %>
取り出した1つのメモに紐づいているprefecture_idから、associationによって関連付けられているprefectureのnameカラムの値を取り出している
(ここで思い出そう。都道府県名のキー名はname:だった。 {id:2, name:'北海道'} )
<%= memo.text %>
ここは普通。memoオブジェクトに格納されたtextカラムの情報を取り出している。
おわり
備忘録おわり。
いろんな方法があるうちの1個なんだろうけど、とりあえず自分なりにまとめる作業が良い勉強になるので書きました。
この記事が気に入ったらサポートをしてみませんか?