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
变量中:wheels
和spare
。 id
也是该方法的范围。我称这些dynamic
变量,但他们的官方名称是什么?
答案 0 :(得分:0)
正确答案是这些方法是在运行时由Ruby metaprogramming生成的。
# 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__ + 1
和CODE
之间的巨大模板在运行时被逐出来生成以下方法:
build_horse
create_horse
create_horse!
因此,当您调用它们时,它们与您在Carriage
类中定义的其他方法完全不同。