自动生成的方法或变量的正确术语?

时间:2014-01-09 23:41:59

标签: ruby-on-rails terminology

Rails大量使用自动生成各种方法和变量。在我自己的私人笔记中,我将这些称为dynamic methods,但这些东西的官方名称是什么?

这些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  

意味着你可以这样做:

> 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变量,但他们的官方名称是什么?

1 个答案:

答案 0 :(得分: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之间的巨大模板在运行时被逐出来生成以下方法:

  • build_horse
  • create_horse
  • create_horse!

因此,当您调用它们时,它们与您在Carriage类中定义的其他方法完全不同。