12
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

[Ruby on Rails]インスタンス変数.カラム名でデータを参照できるのは何故か?

rails初心者です。
railsの基本的すぎる部分なのですが、つまづいてrailsすげーってなったので書き残します。

[疑問]
rails上で例えばusersテーブルを作った際に、何故user.idでidを引けるのか?
[疑問の流れ]
・rubyでは、user.idなどはインスタンスメソッドを定義しないと利用できない。
・railsでは息をするように何も定義せずにやっている。
・なんでだ?
[結論]
railsは普通に作るとmodelがActiveRecord::Baseを継承しているため、自動的にカラム名のメソッドを生成してくれているため。

book.rb
class book

  # attr_reader :title, :price
  def title
    @title
  end
  def price
    @price
  end

  def initialize(title, price)
    @title = title
    @price = price
  end
end

book = Book.new("Programing Ruby", 1980)
puts book.title
puts book.price

上記のclassを生成する問題を行なっている際に、titleとpriceメソッドを作成しないと外部でインスタンス変数を引き出せない。しかし、よく考えたら、rails上でtitleとpriceメソッドを生成した事がない。どうやってインスタンス変数.カラム名でインスタンス変数を引き出しているのか?

[調べた]

そして、気づいた。railsのモデルやコントロールには色々なclassが継承されていた事に。
(rails使っているならば知ってろよ!って話だけど)

Active Record の基礎
上のリンクに、ApplicationRecordを継承したclassを生成すると以下のようなコードをいきなり書くことができる事が書かれている。

p = Product.new 
p.name = "Some Book" 
puts p.name # "Some Book" 

ActiveRecord::Base
公式ドキュメントでは、ActiveRecord::Baseの一番上のcreationの部分に、該当のメソッドが生成される事が書かれている。

user = User.new(name: "David", occupation: "Code Artist")
user.name # => "David"

つまり、なんとなくできるから使っていたけど。自動で作成されるモデルに継承されているActiveRecordに事前にメソッド化の仕掛けがあったということでした。

よく考えるとMVCのMとCについてはrubyでクラスを定義するファイルという大枠は同じもので、そこに対してコントローラーやモデルというrailsに沿った役割を振り分けているということなのだ。

railisすごい。フレームワーク考える人すごい。

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
Sign upLogin
12
Help us understand the problem. What are the problem?