#はじめに
オリジナルアプリの作成中ActiveHashを導入したいので忘れないためにアウトプットしていきます。
##ActiveHashとは
ActiveHashとは、変更されないデータで
変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。
-
頻繁に変更されることがない
-
DBに保存するほどではない
例えばネットショッピングなど住所を書く際に、よくプルダウンで都道府県を選ぶ時があります。ユーザに記入してもらう事も出来ますが、絶対に都道府県が47しかありませんので書かせる手間を省く事が出来ます。
#導入
まずはGemfileに下記のように記述します。
# '' シングルクォーテーション忘れずに!!
gem 'active_hash'
ターミナルで**bundle install
**を入力して導入完了です。
##モデル作成
itemというモデルを作成します。
rails g model item
###ActiveHashのモデル作成
モデルを作成する際,rails g model ~
で作成されると思いますが、今回は直接ファイルを作成して下さい。
都道府県のモデルなのでregionモデルを作成しました。
このようなディレクトリーになると思います。
app>models>profession.rb
###データを記述
作成したモデルの中に早速記述していきます。
class Region < ActiveHash::Base
end
ActiveHash::Base
ActiveHash::Baseは、あるモデル内でActiveHashを用いる際に必要となるクラスです。ActiveHashのGemに定義されています。
また、ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用できるようになります。
クラスができたら早速データを記述します。
データは、配列にハッシュ形式で格納しています。
class Region < 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: '栃木県' },
{ id: 11, name: '群馬県' }, { id: 12, name: '埼玉県' }, { id: 13, name: '千葉県' },
{ id: 14, name: '東京都' }, { id: 15, name: '神奈川県' }, { id: 16, name: '新潟県' },
{ id: 17, name: '富山県' }, { id: 18, name: '石川県' }, { id: 19, name: '福井県' },
{ id: 20, name: '山梨県' }, { id: 21, name: '長野県' }, { id: 22, name: '岐阜県' },
{ id: 23, name: '静岡県' }, { id: 24, name: '愛知県' }, { id: 25, name: '三重県' },
{ id: 26, name: '滋賀県' }, { id: 27, name: '京都府' }, { id: 28, name: '大阪府' },
{ id: 29, name: '兵庫県' }, { id: 30, name: '奈良県' }, { id: 31, name: '和歌山県' },
{ id: 32, name: '鳥取県' }, { id: 33, name: '島根県' }, { id: 34, name: '岡山県' },
{ id: 35, name: '広島県' }, { id: 36, name: '山口県' }, { id: 37, name: '徳島県' },
{ id: 38, name: '香川県' }, { id: 39, name: '愛媛県' }, { id: 40, name: '高知県' },
{ id: 41, name: '福岡県' }, { id: 42, name: '佐賀県' }, { id: 43, name: '長崎県' },
{ id: 44, name: '熊本県' }, { id: 45, name: '大分県' }, { id: 46, name: '宮崎県' },
{ id: 47, name: '鹿児島県' }, { id: 48, name: '沖縄県' }
end
###マイグレーションファイルの編集
Itemテーブルの中にregion_idという名前のカラムを作成しているのは、登録の際に、そのitemに紐付いた都道府県を取得するためです。
Itemテーブルの中で、Regionモデル(ActiveHash)のidを外部キーとして管理することで、そのユーザーに紐付いた職種の取得が実現できます。
class CreateItems < ActiveRecord::Migration[6.0]
def change
create_table :items do |t|
t.string :name, null: false
t.text :text, null: false
t.integer :category_id, null: false
t.integer :status_id, null: false
t.integer :postage_id, null: false
t.integer :region_id, null: false
t.integer :shopping_date_id, null: false
t.integer :price, null: false
t.references :user, foreign_key: true
t.timestamps
end
end
end
記述できたら**rails db:migrate
**していきます。
###アソシエーションの設定
次にitemモデルにアソシエーションを設定します。
itemモデルには1つのregionが紐付いています。
class Item < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :region
end
###バリデーションの設定
class Item < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :region
validates :region_id, numericality: { other_than: 1 }
end
numericality
数値のみかを検証するバリデーションの一種です。
数値であればデータベースに保存され、それ以外では保存されません。
また、オプションでother_than:1
にする事で1保存できなくしました。
###ビューに表示
<%= f.collection_select(:region_id, Region.all, :id, :name, {}, %>
<%= f.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目, 選択肢に表示されるカラム名, オプション, htmlオプション) %>
このような記述でプルダウンして表示されるようになります。