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

时间:2011-03-03 16:39:11

标签: ruby ruby-on-rails-3 activerecord self

在测试轨道模型中的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,为什么你只能使用局部变量?

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

1 个答案:

答案 0 :(得分:82)

这是因为属性/关联实际上是方法(getter / setter)而不是局部变量。当您声明“parent = value”时,Ruby假定您要将值分配给本地变量parent。

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

当谈到getter时,Ruby会先查看是否有一个局部变量,如果找不到它,那么它会尝试找到一个名称相同的方法,这就是为什么你的getter方法没有“self”的原因。

换句话说,这不是Rails的错,但它是Ruby本身的工作方式。

希望有所帮助。