在 Rails 模型中测试 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
... parent 变为 nil,但是如果我使用...
def parent_name=(name)
self.parent = self.class.find_by_name(name)
end
...然后就可以了。
所以,我的问题是,为什么有时需要声明 self.method,为什么可以只使用局部变量?
似乎需要/使用self
in ActiveRecord 是不一致的,我想更好地理解这一点,所以我不觉得我总是在猜测我是否需要声明自己。什么时候应该/不应该在 ActiveRecord 模型中使用 self?
最佳答案
这是因为属性/关联实际上是方法(getters/setters)而不是局部变量。当您声明“parent = value”时,Ruby 假定您要将值分配给局部变量 parent。
在堆栈的某处有一个 setter 方法“def parent=”,要调用它你必须使用“self.parent =”来告诉 ruby 你实际上想要调用一个 setter 而不仅仅是设置一个局部变量。
当涉及到 getter 时,Ruby 首先查看是否有局部变量,如果找不到它,那么它会尝试找到一个具有相同名称的方法,这就是为什么你的 getter 方法在没有“self”的情况下工作。
换句话说,这不是 Rails 的错,而是 Ruby 固有的工作方式。
关于ruby - 为什么在 ruby/rails/activerecord 中并不总是需要 self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183664/