Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
188
Help us understand the problem. What is going on with this article?
@Hassan

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

More than 1 year has passed since last update.

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

この記事もとても分かりやすいです。
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 ファイルを作成しますが
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 を定義しなくてもテーブルのカラムを属性として扱えます。

188
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Hassan
フリーランスの Rails エンジニア。フリーランス・副業のための新しい勤怠管理サービスを作っています。 https://klow.app
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
188
Help us understand the problem. What is going on with this article?