rails初心者です。
railsの基本的すぎる部分なのですが、つまづいてrailsすげーってなったので書き残します。
[疑問]
rails上で例えばusersテーブルを作った際に、何故user.idでidを引けるのか?
[疑問の流れ]
・rubyでは、user.idなどはインスタンスメソッドを定義しないと利用できない。
・railsでは息をするように何も定義せずにやっている。
・なんでだ?
[結論]
railsは普通に作るとmodelがActiveRecord::Baseを継承しているため、自動的にカラム名のメソッドを生成してくれているため。
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すごい。フレームワーク考える人すごい。