LoginSignup
0
0

More than 1 year has passed since last update.

[Rails]active_hashについて

Posted at

初めに

なぜこの記事を書きたかったのか

・変化しないデータを繰り返し使いたいヒト

環境

・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ 8GB 2133 Mhz LPDDR3
・MacOS Big Sur バージョン 11.5.2

記事の目次

1)どういうときに使う?
2)何ができる?
3)どうやって使う?
4)最後に

どういうときに使う?

変更されないデータを繰り返し使いたいとき!

(例えば、都道府県、市区町村、動物の名前、商品の部類、栄養素など)

何ができる?

・事前に登録したデータをプルダウン形式で使用することができる。
(イメージ)

どうやって使う?

(1)Gemfileファイルに"active_hash"というgemをインストール

(Gemfile)
gem 'active_hash'

(ターミナル)
bundle install

(2)app/model/ココに新しくモデル名.rbファイルを作り、ActiveHash::Baseを使い、変更されないデータベースを作る。

※ActiveHash::Baseで、activeRecordと同じようなメソッドを使用することができる。今回は、NutritionモデルにActiveHash::Baseを継承したので、Nutritionモデルに定義したデータに対してActiveRecordのようなメソッドが使用できる。

※self.dataでプルダウンのデータを入れることができる

(書き方)
class モデル名 < ActriceHash::Base
  self.data = [
    { id: 数字, name: '表示させたいテキスト'},
    { id: 数字, name: '表示させたいテキスト'},
    { id: 数字, name: '表示させたいテキスト'}
  ]
end


class Nutrition < ActiveHash::Base
 self.data = [
   { id: 1, name: '--' },
   { id: 2, name: 'タンパク質' },
   { id: 3, name: '脂質' },
   { id: 4, name: '炭水化物' },
   { id: 5, name: '食物繊維' },
   { id: 6, name: 'その他' }
 ]
 end

(3)db/migrate/ooooooxxxxx_create_genre.rb(*今回はgenreというテーブル)にカラムを追加する。

(追加カラム)
t.integer :nutrition_id  , null: false

(追加後、ターミナルで反映)
rails db:migrate

(4)つなげたいモデルとアソシエーションを設定x

※belongs_toを設定するときは"extend"を、has_manyを設定するときは"include"をActiveHashの後ろに下記のように追加する。
モデル:nutrition(栄養素)と、モデル:genre(ジャンル)の場合、栄養素がhas_many: genre、ジャンルがbelongs_to:nutritionとなるので下記のような書き方になる。

(app/models/nutrition.rb)
class Nutrition < ApplicationRecord 
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :genre
end
(app/models/genre.rb)
include ActiveHash::Associations
  has_many :nutritions

(5)つなげたモデルのバリデーションを設定

(nutritionで栄養素の選択が「ーー」のときは保存しないようにする)

※numercalityとは、数字を検知して保存してくれる役割を持っています。下記のように"other_than:1"以外の数字を検知して保存してくださいと命令できる。

(app/models/nutritions.rb)
  validates:nutrition_id, numercality: {other_than:1}

(6)viewで表示する(form_with内に追加)

書き方

<%= f.collection_select(:activehashのモデル名_id、activehashのモデル名.all、DBに保存するとき値、viewに表示させたい値、html用オプション)>

<%= f.collection_select(:nutrition_id, Nutrition.all, :id, :name, {}, {class:"nutrition-select}) %>

最後に、今回の記事を書いて思ったこと。。

言語化ってやっぱり難しいと思った。いつもよりかなり時間がかかった。どうしても誰かに対して説明という感覚より機械的にこうしたあとはこうするというふうな説明の仕方になってしまう。

ココまで読んでくださいましてありがとうございます!読みづらいと感じたり、指摘がございましたら成長への励みにもなりますのでコメントお願いします!☺

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