LoginSignup
1
1

Railsの`attribute`メソッドの活用方法

Posted at

はじめに

Ruby on Railsのattributeメソッドは、モデル内で仮想的な属性(カラムを持たない属性)を定義するのに役立ちます。この記事では、attributeの基本的な使用方法やそのメリットについて解説します。

attributeとは?

attributeメソッドは、Active Recordモデルに仮想的な属性を追加するためのメソッドです。これを使用することで、データベースのカラムとは独立した属性をモデルに追加することができます。

class User < ApplicationRecord
  attribute :nickname, :string
end

上記の例では、Userモデルにnicknameという仮想的な属性を追加しています。

  1. なぜattributeを使うのか?
    柔軟性: データベースに変更を加えずにモデルに新しい属性を追加できます。
    変換: カスタムの型変換を指定できます。
    一時的な属性: フォームオブジェクトやサービスオブジェクトに仮想的な属性を追加する場面で有用です。
  2. 実用的な例
    例として、ユーザーが生年月日から年齢を計算する機能を考えます。
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
1
1
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
1