ActiveHashによるカテゴリー選択
ActiveHashとは
都道府県名などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。また、このGemを使うことでデータベースに47の都道府県名のカラムを作ることなくデータを管理することができます。今回は私が作成中のアプリケーションの例で紹介していきます。
アプリケーションの説明として、収入の分類(給料、ボーナス、副業etc)など決まった選択肢をカテゴリー選択できること目標とします。
公式ページはこちら↓↓↓
https://github.com/zilkey/active_hash
Gemのインストール
開発環境 rails 6.0.0
GemfileGemfileに追記する↓↓↓
gem 'active_hash'
引き続きbundle installを実行します。
モデルの作成
Incomeモデルを作成します。
rails g model income
マイグレレーションを実行します。↓↓↓
class Incomes < ActiveRecord::Migration[6.0]
def change
create_table :incomes do |t|
t.integer :category_id , null: false # 収入分類のカラム
t.integer :price , null: false # 金額
t.timestamps
end
end
end
この時prefectureにアンダーバーでid[_id]を付ける必要があります。idを外部キーとして管理することでActiveHashに紐付いた収入分類を取得する事ができます。
引き続きActiveHashのモデルを作成します。この時、データベースに新たにテーブルを作成する必要はありません。
またその他のファイルのファイルも必要としません。
class Category < 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: 'その他収入' }
]
# moduleを取り込み↓↓
include ActiveHash::Associations
has_many :incomes # incomeモデルとのアソシエーション
end
次にincomeモデルも編集します。
class Income < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :income_category
# category_idのid:1以外のときに保存できるバリデーションを設定(1は「--」です。)↓↓
validates :income_category_id, numericality: { other_than: 1}
end
ビューにカテゴリー選択をプルダウンで表示
ルーティングとコントローラーを編集した後、ビューを編集します。
<%= form_with model: @income, url:incomes_path, local: true do |f| %>
<%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:"income-select"}) %>
<%= f.text_field :text, class:"text", placeholder:"金額" %>
<%= f.submit "保存する" ,class:"submit" %>
<% end %>
collection_selectとは、データをプルダウン形式で表示させることができるメソッドです。このとき()内は順番に第1引数(保存するカラム名)、第2引数(配列データ)、第3引数(保存される項目、テーブルにはidで保存される)、第4引数(選択肢に表示されるカラム名、ここでは収入区分)、第5引数(オプション)、クラス名となります。
これによって収入区分がプルダウンで選択できます。
このようになります↓↓↓
以上です!!!!参考になれば嬉しいです!
また誤り等あればご指摘お願いします。