2016-11-18 13 views
1

私はRubyとRailsの、私を殺すいつか「条約の構成オーバー」親切...Railsはモデルで定義されていないため、モデル属性を解決する方法は?

OKを学び始めています、私はRailsのコマンド経由でのRailsでUserモデルを作成しました。 Usernameageのような属性で作成されたモデルもあります。

しかし、私はuser.rbを開く:

class User < ApplicationRecord 
end 

それはこれらのみを持っています。 attr_accessorが見つかりません。だから私は検索を続け、属性の名前とメソッドはどこかに保持されていることが分かりましたので、基本的にオブジェクトを作成して、属性user.nameuser.ageを参照することができます。

私の質問は、属性はどこにRailsに保存されていますか?そして、これはどのように起こっていますか?これらの属性は

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 
end 

そうに保たれている:私はapplication_record.rbを開いて、属性があまりにもスーパーApplicationRecordに保たれているとは思いませんか?そしてRubyがこのような属性を解決する方法は?私はその背後にある仕組みを知りたい。

答えて

5

ActiveRecordはコードを変更しませんが、実装方法を変更しません。その代わりに、Rubyの共通のパターンであるものは、動的にのメソッドを定義しています。コードはコードを効果的に書くので、これはしばしば「メタプログラミング」と呼ばれます。それは文字通りコードを書いていないことに注意してください。プログラムがメモリにロードされてから変換されるときだけです。

通常、列は、SHOW FIELDSのようなSQLコマンドを実行することによって自動的に検出され、構造と型が決定されます。それに応じて、これらのメソッドが生成されます。

このメカニズムを知りたければ、ActiveRecordのソースコードを読むことができますが、多くのことがありますが、時にはナビゲートするのが少し難しいかもしれません。

関連する問題