1
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.

ActiveHashについて

Posted at

オリジナルアプリ作成中に、ActiveHashを導入し実装したので
忘れないため記事にしたいと思います。

ActiveHashとは?

まず、ActiveHashとは、変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。
例えば、都道府県などは変更されることはありませんよね。
そういったデータをデータベースではなくモデルで管理しようというものです。

私の開発したオリジナルアプリの部分ですと下記の画像の部分になります。
Image from Gyazo

「文章問題」と「写真にタイトルをつけてください」の部分を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の設定方法です。
まだまだ、初心者で間違いがあるかもしれません。
なにかございましたら、ご指摘いただければ幸いです。

1
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
1
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?