2016-11-18 65 views
1

我開始學習Ruby和Rails,有時會發現「Convention over Configuration」類型的查殺...Rails如何解析模型屬性,因爲它們未在模型中定義?

好吧,我通過Rails命令在Rails中創建了User模型。 User模型也創建了一些屬性,如nameage

但是當我打開user.rb

class User < ApplicationRecord 
end 

它只有這些。我找不到attr_accessor。所以我繼續搜索,發現屬性名稱和方法保存在某個地方,所以基本上我仍然可以照常創建對象並引用屬性user.nameuser.age

我的問題是,Rails中保存的屬性在哪裏?這是怎麼發生的?我不認爲該屬性保持在超ApplicationRecord過,我打開application_record.rb

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

那麼,是那些屬性保存?以及Ruby如何解決這樣的屬性?我想知道背後的機制。

回答

5

ActiveRecord不會修改您的代碼,它不會改變事情的實現方式。相反,它是Ruby中的一種常見模式,它動態定義方法。這通常被稱爲「元編程」,因爲您的代碼有效地編寫代碼。請注意,它不會真正寫入代碼,只有當程序加載到內存中時纔會自行轉換。

通常通過運行SQL命令(如SHOW FIELDS)來自動發現列以確定結構和類型。然後這些方法得到相應的生成。

如果您想知道機制,您可以隨時閱讀ActiveRecord源代碼,但請記住它執行了很多操作,並且有時可能會有點困難。