attr_accessor
組み込みの Ruby メソッドであり、コンテキスト ActiveRecord では特別な意味を持ちません。attr_accessor :tag_list
は基本的に次のコードと同等です。
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
ただし、ActiveRecord モデルでは、次のようなものが必要になる場合があります。
def tag_list
self[:tag_list]
end
def tag_list=(val)
self[:tag_list] = val
end
わずかな違いがあります。最初の方法でobj[:tag_list]
は、getter および setter と同じストレージを使用しません。後者では、そうです。
ゲッター/セッターの概念の説明
Ruby では、次の 2 行のコードは同等です。
thing.blabla
thing.blabla()
blabla
どちらもオブジェクトのメソッドを呼び出し、そのメソッドthing
内で評価された最後の式に評価されます。return
つまり、上記の getter メソッドの場合、メソッドは単にメソッドの最後の式 (@tag_list
インスタンス変数の値) を返すだけなので、ステートメントも必要ありません。
また、これらの 2 行のコードは同等です。
thing.blabla=("abc")
thing.blabla = "abc"
どちらもblabla=
オブジェクトのメソッドを呼び出しますthing
。文字を含む特別な名前は、=
他のメソッド名と同じように使用できます。
attributesと呼ばれることもあるが、実際には単純なメソッドであるという事実により、値を返すか受け入れる前に、値に変換された特別なロジックを使用することもできます。例:
def price_in_dollar
@price_in_euro * 0.78597815
end
def price_in_dollar=(val)
@price_in_euro = val / 0.78597815
end