🐙

Rails `attr_accessor` と `attribute` の違い

2023/08/02に公開

Railsを使用して開発を行う際、モデルに属性を追加するためのメソッドとしてattr_accessorattributeがありますが、それぞれどのような場面で使われ、どんな違いがあるのでしょうか。この記事では、それらの違いと使用場面について詳しく解説します。

1. attr_accessorとは

class User
  attr_accessor :temporary_password
end

user = User.new
user.temporary_password = "secret123"
puts user.temporary_password
  • Rubyの基本的な機能で、オブジェクトのインスタンス変数のgetterとsetterを自動的に生成します。
  • データベースやActiveRecordとは関連がありません。
  • 一時的なデータ保持や、データベースに保存しない属性のために使用されることが多いです。

2. attributeとは

class Product < ApplicationRecord
  attribute :price, :integer, default: 0
end

product = Product.new
puts product.price  # => 0
  • ActiveRecordモデル内で使用されるメソッドで、仮想属性を追加することができます。
  • 指定した型に基づいて値の型変換やデフォルト値の設定が可能です。
  • ActiveRecordの機能をフルに活用できるため、バリデーションやコールバックなどの拡張が容易です。

3. 主な違い

  1. データベースとの関連性:

    • attr_accessor:ActiveRecord やデータベースとは関係なし
    • attribute:ActiveRecord の一部として動作
  2. 型変換:

    class JsonType < ActiveRecord::Type::String
      def deserialize(value)
        JSON.parse(value) if value.present?
      end
    
      def serialize(value)
        value.to_json if value.present?
      end
    end
    
    class YourModel < ApplicationRecord
      attribute :json_data, JsonType.new
    end
    
    • attr_accessor:型変換の機能なし
    • attribute:指定された型に応じて型変換を行う
  3. 拡張性:

    • attr_accessor:基本的なgetterとsetterのみ
    • attribute:カスタム型やデフォルト値の設定が可能

4. 使用場面

  • 一時的なパラメータを持たせたい場合:

    class Registration < ApplicationRecord
      attr_accessor :terms_accepted
    
      validates :terms_accepted, acceptance: true
    end
    

    attr_accessorを使い、その属性に対してRailsのバリデーションを適用する。

  • 型変換やデフォルト値の設定が必要な場合:

    class Product < ApplicationRecord
      attribute :price_in_cents, :integer, default: 0
      attribute :tax, :decimal, default: 0.1
    end
    

    attributeを使用し、カスタム型やデフォルト値の指定を行う。

まとめ

attr_accessorattributeは似ているようで異なる特性を持つメソッドです。それぞれの特性を理解し、適切な場面で使用することがRails開発の効率を上げる鍵となります。

Discussion