LoginSignup
20
13

More than 3 years have passed since last update.

[Rails]Active Hashの導入

Last updated at Posted at 2020-10-15

はじめに

Active_Hashとは、都道府県名やカテゴリー選択などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるgemです。
Active_Hashを用いることで、モデルファイルに直接記述した変更されないデータに対して、ActiveRecordのメソッドを用いることができます。

目次

1.Active Hashのインストール
2.モデルの作成
3.マイグレーションファイルの編集
4.アソシエーションの設定
5.ビューファイルの編集

1. Active Hashのインストール

gemfileに以下を記述します。
その後、コマンドでbundle installを実行します。

gemfile
gem 'active_hash'

2. モデルの作成

今回はPostモデルとCategoryモデルを作成します。
Postモデルはいつも通りに作成します。

ターミナル
rails g model post

Categoryモデルを作成する際は、「--skip-migration」オプションを使用します。
「--skip-migration」を使用することで、マイグレーションファイルの生成を行わないようにします。
今回、カテゴリーを情報をデータベースには保存をしないのでマイグレーションファイルを作成しません。

ターミナル
rails g model category --skip-migration

category.rbでCategoryクラスを定義し、ActiveHash::Baseクラスを継承します。
ActiveHash::Baseを継承することで、Categoryモデルに定義したオブジェクトに対してActiveRecordのメソッドが使用できるようになります。

app/models/category.rb
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: 'ヘアカラー' },
    { id: 11, name: 'ヘアスタイリング' },
    { id: 12, name: 'シャンプー・コンディショナー' },
    { id: 13, name: 'コンタクトレンズ' }
  ]
end

データは配列にハッシュの形で格納しています。

3. マイグレーションファイルの編集

postsテーブルにはcategory_idカラムを作成します。
_idになっているのはidに紐づいているカテゴリーを取得し、カテゴリーのidをpostsテーブルに保存するからです。
カラム型はinteger型にします。

db/migrate/20XXXXXXXXXXXX_create_posts.rb
~~
t.integer :category_id, null: false
~~

4. アソシエーションの設定

ActiveHashにはbelongs_to_active_hashメソッドが用意されています。
ActiveHashを使って作成したモデルに対してアソシエーションを設定する場合は、belongs_to_active_hashメソッドを使います。
ActiveHash::Associations::ActiveRecordExtensionsを記述することで、belongs_to_active_hashメソッドを使用できます。

app/models/post.rb
class Post < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :category
end

5. ビューファイルの編集

今回はデータをプルダウン形式で表示しました。
ですので、collection_selectメソッド使って表示します。

<%= form.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目(表示する際に参照するDBのカラム名), 選択肢に表示されるカラム名, オプション, htmlオプション(classなど)) %>
app/views/posts/new.html.erb
<%= f.collection_select(:category_id, Category.all, :id, :name, {}, {class:”category-select"}) %>

参考リンク

20
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
13