オリジナルアプリ作成中に、ActiveHashを導入し実装したので
忘れないため記事にしたいと思います。
ActiveHashとは?
まず、ActiveHashとは、変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。
例えば、都道府県などは変更されることはありませんよね。
そういったデータをデータベースではなくモデルで管理しようというものです。
私の開発したオリジナルアプリの部分ですと下記の画像の部分になります。
「文章問題」と「写真にタイトルをつけてください」の部分をActiveHashを使用しました。
導入の仕方
まずは、gemfileに下記を記述します
Gemfile
gem 'active_hash'
そして、ターミナルより
bundle install
サーバーを起動していたら、再起動させます。
これで、導入は完了です。
モデルとデータベースを作成しよう。
先ほどの画像の情報は、postモデルを作成しデータベースに保存しています。
まず、postモデルを作成します。
% rails g model post
作成が済んだら、データベースに記述します。
class CreatePosts < ActiveRecord::Migration[6.0]
def change
create_table :posts do |t|
t.string :title
t.string :sentence, null: false
t.integer :genre_id, null: false
t.references :user, foreign_key:true
t.timestamps
end
end
end
注目するところは、下記の部分です。
t.integer :genre_id, null: false
カラム名にidをつけて、カラムの型はinteger型でを指定します。
記述を行ったら
% rails db:migrate
これで、データベースの設定は完了です。
Genreモデルの作成
次にgenreモデルを作成し保存する内容を記述します。
% rails g model genre
そして、作成したモデルないに下記の記述を行います。
class Genre < ActiveHash::Base
self.data =[
{ id: 1, name: '--' },
{ id: 2, name: '文章問題' },
{ id: 3, name: '写真にタイトルをつけてください' },
]
end
まずは、モデルの「Genreクラス」を定義し、ActiveHash::Baseクラスを継承します。
ActiveHash::Baseは、あるモデル内(クラス内)でActiveHashを用いる際に必要となるクラスです。ActiveHashのGemに定義されています。
また、ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用できるようになります。
そして、保存したいものに番号をつけてその番号をデータベースで管理します。
アソシエーションの設定
postモデルに下記を記述します。
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :genre
投稿するものは、1つのジャンルに紐付いています。そのため、Articleモデルにはbelongs_toを設定します。
また、設定するには、extend ActiveHash::Associations::ActiveRecordExtensionsの記述も必要です。
バリデーションの設定
次にバリデーションの設定を行います。
validates :genre_id, numericality: { other_than: 1, message: 'Select'}
これは、IDが「1」の時は保存できないよという意味です。
今回IDが1の時は、「--」が設定されているので、バリデーションの記述を行いました。
ビューの記述
最後にビューでの記述です。
<%= f.collection_select(:genre_id, Genre.all, :id, :name, {}, {class:"select-box"}) %>
引数の内容は下記になります。
<%= form.collection_select(保存されるカラム名, 配列データを指定する, カラムに保存される項目, 選択肢に表示されるカラム名, オプション, htmlオプション) %>
第1〜第4引数の設定は必ず必要です。
以上が、ActiveHashの設定方法です。
まだまだ、初心者で間違いがあるかもしれません。
なにかございましたら、ご指摘いただければ幸いです。