所以我正在研究ruby中的关联,并想知道它们是如何从句法角度出发的。
看着:
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager
has_many :milestones
has_and_belongs_to_many :categories
end
我的理解是has_many例如是一个使用参数“:milestones”调用的方法。但这怎么可能呢?如何在类体中调用方法而不在另一个方法或函数内部?
不确定你是否理解我的意思。但希望有人可以向我解释。
答案 0 :(得分:4)
但这怎么可能呢?如何在类体中调用方法,而不是在另一个方法或函数内部?
类定义就像其他任何代码一样。加载类文件时,从上到下评估其正文。这包括调用has_many
之类的方法(这个方法来自ActiveRecord::Base
的深度)。或任何其他方法。
class Foo
puts "Loading class #{name}"
end
# >> Loading class Foo
请注意,只需使用类加载文件即可执行此puts
。你甚至不必做f = Foo.new
或类似的事情。
答案 1 :(得分:1)
Ruby的对象模型与更古典的语言面向对象语言(如C ++或java)非常不同,其中类就像刻在石碑上的蓝图。
在Ruby类中是可变的类对象。另外一种方法是将类作为工厂来创建自己的实例。
您可以在类定义中执行所需的任何代码:
class World
puts "Hello #{name}"
end
从上到下评估。
这是metaprogramming的可扩展使用。例如,您使用attr_accessor
声明了setter和getter:
class Person
attr_accessor :age
def initialize(age:)
@age = age
end
end
通过添加age
和age=
方法修改课程。看起来像这样:
class Person
def age
@age
end
def age=(value)
@age = value
end
def initialize(age:)
@age = age
end
end
Rails协会以同样的方式工作 - 只是更复杂。 belongs_to :portfolio
创建了一个setter和getter以及reflection objects,用于跟踪它的关联类型。