LoginSignup
15
13

More than 5 years have passed since last update.

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

Posted at

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すごい。フレームワーク考える人すごい。

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13