Railsから入った人へ【attr_accessor】って?

  • 23
    Like
  • 0
    Comment

こっちを参考にしてください

この記事もとても分かりやすいです。
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オブジェクトを定義しようとすると

db/migrate/20160304060143_create_users.rb
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ファイルを作成しますが
純粋な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の利用用途

・オブジェクトの属性を定義したい時
・(gemを作成する時、DBにアクセスする必要がない時)