2014-01-09 35 views
0

Rails大量使用自動生成各種方法和變量。在我自己的私人筆記中,我將這些稱爲dynamic methods,但這些東西的官方名稱是什麼?建立這樣的關係自動生成的方法或變量的正確術語?

class Carriage < ActiveRecord::Base 
    # attrs: id, wheels, spare 
    has_one :horse 
end 
class Horse < ActiveRecord::Base 
    # attrs: id, carriage_id, name 
    belongs_to :carriage 
end 

意味着你可以這樣做:

有些dynamic methods例子

> Carriage.create(wheels: 2).create_horse(name: "Fledge") 

在這個例子中,create_horse將是dynamic method

又如:

如果我要建立一個模型方法車輪添加到Carriage

class Carriage < ActiveRecord::Base 
    self.wheels = wheels + 1 if spare == true 
end 

我有機會獲得一個intance的屬性,在各自dynamic變量:wheelsspareid也適用於該方法。我稱這些dynamic變量,但他們的官方名稱是什麼?

+0

如果有一個官方的名字,我希望能在[docs]中找到它們(http://guides.rubyonrails.org/association_basics.html#detailed-association-reference),但我沒有看到它們叫做除了方法之外的任何東西 – Dhaulagiri

+0

個人而言,我將它們稱爲「魔術方法」,因爲Rails爲您創建了「像魔術一樣」,但這可能不是標準的,比方說。 – MrTheWalrus

+0

哈哈我喜歡:) – Starkers

回答

0

正確的答案是這些方法在運行時由Ruby metaprogramming生成。

看看the source here

# Defines the (build|create)_association methods for belongs_to or has_one association 

def self.define_constructors(mixin, name) 
    mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1 
    def build_#{name}(*args, &block) 
     association(:#{name}).build(*args, &block) 
    end 

    def create_#{name}(*args, &block) 
     association(:#{name}).create(*args, &block) 
    end 

    def create_#{name}!(*args, &block) 
     association(:#{name}).create!(*args, &block) 
    end 
    CODE 
end 

基本上<<-CODE, __FILE__, __LINE__ + 1CODE之間巨大的模板在運行時獲得evaled生成以下方法:

  • build_horse
  • create_horse
  • create_horse!

所以當你給他們打電話,他們和你在Carriage上定義的其他方法沒有任何不同。

+0

非常有趣,但他們似乎並沒有一個名字。 'define_constructors'是否意味着他們被稱爲'構造函數'也許? – Starkers

+0

完全不是,它們被稱爲構造函數是因爲它們構建對象,但是這並不表示元編程的結果:) –