为什么在ruby / rails / activerecord中总是不需要自己?

在轨道模型中testing一个getter / setter对,我发现了一个很好的例子,我一直认为这个例子很奇怪,不一致。

在这个例子中,我正在处理class Folder < ActiveRecord::Base

Folder belongs_to :parent, :class_name => 'Folder'

在getter方法上,如果我使用:

 def parent_name parent.name end 

…要么…

 def parent_name self.parent.name end 

…结果是完全一样的,我得到父文件夹的名称。 但是,在getter方法中,如果我使用…

 def parent_name=(name) parent = self.class.find_by_name(name) end 

…父母变成零,但如果我使用…

 def parent_name=(name) self.parent = self.class.find_by_name(name) end 

…然后它工作。

所以,我的问题是,为什么有时需要声明self.method,为什么只能使用局部variables呢?

看来在ActiveRecord中需要/使用self是不一致的,我想更好地理解这一点,所以我不觉得我总是在猜测是否需要声明自己。 您应该何时/不应该在ActiveRecord模型中使用自我?

这是因为属性/关联实际上是方法(getter / setter)而不是本地variables。 当你声明“parent = value”时,Ruby假定你想把值赋给本地variablesparent。

在堆栈的某个地方有一个setter方法“def parent =”,并调用你必须使用“self.parent =”来告诉ruby你实际上想调用setter而不是设置一个局部variables。

当涉及到getters的时候,Ruby会先查看是否有一个局部variables,如果找不到,那么它会试图find一个同名的方法,这就是为什么你的getter方法没有“self”的原因。

换句话说,这不是Rails的错,但是Ruby本身是如何工作的。

希望有所帮助。