🐙
Rails `attr_accessor` と `attribute` の違い
Railsを使用して開発を行う際、モデルに属性を追加するためのメソッドとしてattr_accessor
とattribute
がありますが、それぞれどのような場面で使われ、どんな違いがあるのでしょうか。この記事では、それらの違いと使用場面について詳しく解説します。
attr_accessor
とは
1. class User
attr_accessor :temporary_password
end
user = User.new
user.temporary_password = "secret123"
puts user.temporary_password
- Rubyの基本的な機能で、オブジェクトのインスタンス変数のgetterとsetterを自動的に生成します。
- データベースやActiveRecordとは関連がありません。
- 一時的なデータ保持や、データベースに保存しない属性のために使用されることが多いです。
attribute
とは
2. class Product < ApplicationRecord
attribute :price, :integer, default: 0
end
product = Product.new
puts product.price # => 0
- ActiveRecordモデル内で使用されるメソッドで、仮想属性を追加することができます。
- 指定した型に基づいて値の型変換やデフォルト値の設定が可能です。
- ActiveRecordの機能をフルに活用できるため、バリデーションやコールバックなどの拡張が容易です。
3. 主な違い
-
データベースとの関連性:
-
attr_accessor
:ActiveRecord やデータベースとは関係なし -
attribute
:ActiveRecord の一部として動作
-
-
型変換:
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
:指定された型に応じて型変換を行う
-
-
拡張性:
-
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_accessor
とattribute
は似ているようで異なる特性を持つメソッドです。それぞれの特性を理解し、適切な場面で使用することがRails開発の効率を上げる鍵となります。
Discussion