具体是什么has_many以及它是如何工作的

时间:2017-05-22 18:52:16

标签: ruby-on-rails ruby activerecord

所以我正在研究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”调用的方法。但这怎么可能呢?如何在类体中调用方法而不在另一个方法或函数内部?

不确定你是否理解我的意思。但希望有人可以向我解释。

2 个答案:

答案 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

通过添加ageage=方法修改课程。看起来像这样:

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,用于跟踪它的关联类型。