はじめに
Ruby on Railsのattribute
メソッドは、モデル内で仮想的な属性(カラムを持たない属性)を定義するのに役立ちます。この記事では、attribute
の基本的な使用方法やそのメリットについて解説します。
attribute
とは?
attribute
メソッドは、Active Recordモデルに仮想的な属性を追加するためのメソッドです。これを使用することで、データベースのカラムとは独立した属性をモデルに追加することができます。
class User < ApplicationRecord
attribute :nickname, :string
end
上記の例では、Userモデルにnicknameという仮想的な属性を追加しています。
- なぜattributeを使うのか?
柔軟性: データベースに変更を加えずにモデルに新しい属性を追加できます。
変換: カスタムの型変換を指定できます。
一時的な属性: フォームオブジェクトやサービスオブジェクトに仮想的な属性を追加する場面で有用です。 - 実用的な例
例として、ユーザーが生年月日から年齢を計算する機能を考えます。
class User < ApplicationRecord
attribute :birthdate, :date
def age
return unless birthdate
today = Date.today
age = today.year - birthdate.year
age -= 1 if today < birthdate + age.years
age
end
end
この例では、birthdateという仮想属性を使用して、ユーザーの年齢を計算するメソッドageを提供しています。
その他の使用例
仮想属性の追加:
データベースのカラムとは関係なく、モデルに属性を追加したい場合があります。このような属性を仮想属性といいます。以下は、Book モデルに rating という仮想属性を追加する例です。
class Book < ApplicationRecord
attribute :rating, :integer
end
属性の型変換:
属性の型をカスタムして、特定の振る舞いを持たせることができます。例えば、Boolean型を持つ属性をカスタムして、文字列 "true" または "false" としてDBに保存する場合の例を以下に示します。
class User < ApplicationRecord
attribute :admin, :string, default: "false", cast: :boolean
end
ここでは :cast オプションを使用して、Booleanの値を文字列として保存するようにカスタマイズしています。
デフォルト値の設定:
attribute メソッドを使用すると、属性のデフォルト値も設定できます。以下の例では、新しい User オブジェクトが作成されたときに、role 属性のデフォルト値として "guest" が設定されます。
class User < ApplicationRecord
attribute :role, :string, default: "guest"
end
カスタム型の定義:
RailsのAttributes APIを使用すると、カスタムの型も定義することができます。例えば、JSON形式の文字列をハッシュとして読み書きするカスタム型を定義する場合の例を以下に示します。
class JsonType < ActiveRecord::Type::String
def deserialize(json_string)
JSON.parse(json_string || "{}")
end
def serialize(hash)
hash.to_json
end
end
class UserProfile < ApplicationRecord
attribute :preferences, JsonType.new
end
attribute
とインスタンス変数の使い分け
Ruby on Railsのモデル内でデータを保持するための方法として、attribute
とインスタンス変数がよく用いられます。それぞれの特性と適切な使用場面を理解することで、コードの可読性や保守性を向上させることができます。
インスタンス変数
-
定義: クラス内のメソッドで使用される変数。
@
を接頭辞として持ちます。 - 特性: メソッド間でのデータの共有や、オブジェクトの内部状態の保持に利用されます。
- 使用場面: コントローラ内でビューにデータを渡す際や、クラスの内部でのみ使用する一時的なデータの保持に適しています。
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
end
attributeメソッド
- 定義: Active Recordモデルの仮想的な属性を定義するメソッド。
- 特性: データベースのカラムとは独立した属性をモデルに追加できる。型変換やデフォルト値の指定が可能。
- 使用場面: データベースに保存されないが、モデル内での状態管理やビジネスロジックに必要な属性を定義する場合に適しています。
class User < ApplicationRecord
attribute :birthdate, :date
end