0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Active Hashの使用方法

Last updated at Posted at 2020-11-28

テーブルを使用するがデータが決まっている場合、データベースにデータを保存せずにテーブルを使用するActive Hashの使用をします。

例えば性別の場合、男性・女性・その他の3通りのため、テーブルでデータを作成する必要がありません。

Active Hash導入

active_hashのgemを導入します。

Gemfile
gem 'active_hash'
ターミナル
bundle install

Active Hash用のテーブル作成

今回性別(gender)テーブルを作成します。

Active Hashの場合、データベースに保存するために必要なマイグレーションファイルが不要なため、--skip-migrationを追記します。

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

コマンド入力後、以下のファイルが作成されます。
このファイルに、カラムやレコードを手動で設定します。

app/models/gender.rb

モデルの設定

先ほど作成したファイルより、モデルの設定をします。

継承先設定

genderモデルにActiveHash::Baseを継承し、
ActiveRecordと同じようなメソッドを使用できるようにします。

変更前

```ruby:app/models/gender.rb class SleepTime < ApplicationRecord end ```

変更後

```ruby:app/models/gender.rb class SleepTime < ActiveHash::Base end ```

カラムとレコード設定

genderモデルで使用するカラムとレコードを設定します。

app/models/gender.rb
class Gender < ActiveHash::Base
  self.data = [
    { id: 1,  type: '男性' },
    { id: 2,  type: '女性' },
    { id: 3,  type: 'その他' }
  ]
end

コントローラーからビューに引継ぎして表示

genderテーブルのデータをコントローラーで取得し、ビューに引継ぎさせます。
※今回はtestコントローラー→ビューで使用します。

app/controllers/test_controller.rb
class TestsController < ApplicationController
  def index
    # genderテーブルの全データ取得
    @genders = Gender.all
    # genderテーブルの指定カラムのみ取得(今回はtypeカラムのみ取得)
    @genders_type = Gender.pluck(:type)
  end
end

Allメソッドで取得したデータをビューで表示する時、
Active Hashでは「all_records」メソッドを使用しないといけないため注意

app/views/test.index.html.erb

# allメソッドで取得したデータの1配列目のtypeデータ
<%= @genders.all_records[1].type %>
=> 男性

<%= @genders_type[2] %>
=> 女性

参考

https://hirocorpblog.com/post-221/
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?