こっちを参考にしてください
この記事もとても分かりやすいです。
Rubyのattr_accessorって何?[和訳]
http://bryankawa.hatenablog.com/entry/2017/01/28/150537
#まとめ
migrationでオブジェクトのもつ属性を定義することと(✭ほぼ)同義
書き込みも読み込みもできる。
✭ migration で定義した型は静的だが、attr_accessorの型は動的に決まる
#良くある説明
def title=(t)
@title = t
end
def title
@title
end
は
attr_accessor :title
と短く書ける。。。
最初見た時、すんなり理解できました?
私は3時間ぐらい空を仰ぎました。
改めて、Railsのmigrationと比較して考えたらスッキリしたのでまとめます。
#RailsからRubyに入った人への説明
例えば、name,descriptionという属性を持つUserオブジェクトを定義しようとすると
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :description
t.timestamps null: false
end
end
end
Railsでは上記の様な migration ファイルを作成しますが
DBを扱わない純粋なRubyのコードでは、
class User
attr_accessor :name, :description
end
と書くことが出来ます!!
↑の migration ファイルの場合、name, description の型は String 型から変わらない
つまり、どちらも
user = User.new
user.name = "hassan"
このようにオブジェクトの属性に値を代入することができる。
attr_accessor は、型に縛られず値を入れることができます。
(テーブルのカラム=オブジェクトの属性)をクラスの中で定義しているイメージ。
この路線から入る場合、
attr_accessorの型はどうなっているのか確認してみよう。
#確認
class User
attr_accessor :name, :description
def print_upcase
puts name.upcase
end
end
user = User.new
=> #<User:0x007fb7f9bbd2b8>
user.name = "hassan"
=> "hassan"
user.description = "将来有望"
=> "将来有望"
user.name = true
=> true
user.name = 12
=> 12
user.print_upcase
NoMethodError: undefined method `upcase' for 12:Fixnum
user.name = "hassan"
=> "hassan"
user.print_upcase
=> HASSAN
型は動的です(ここで、良くある説明のコードを見なおしてみると納得)
#attr_accessorの利用用途
・読み取りも書き込みもできるオブジェクトの属性を定義したい時
ちなみに attr_reader
は読み出し専用の属性を定義したいときに使い、
attr_writer
は書き込み専用の属性を定義したいときに使う。
補足
厳密には migration は DB のテーブルとカラムを定義するときに使っていますが、Rails では対応する Model を作成すると明示的に attr_accessor を定義しなくてもテーブルのカラムを属性として扱えます。