Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';ruby/rails/activerecord中是否总是需要self?_Ruby_Ruby On Rails 3_Activerecord_Self - Fatal编程技术网

为什么不是';ruby/rails/activerecord中是否总是需要self?

为什么不是';ruby/rails/activerecord中是否总是需要self?,ruby,ruby-on-rails-3,activerecord,self,Ruby,Ruby On Rails 3,Activerecord,Self,在rails模型中测试getter/setter对时,我发现了一个我一直认为奇怪且不一致的行为的好例子 在本例中,我处理的是类文件夹“文件夹” 在getter方法上,如果我使用: def parent_name parent.name end ……或者 def parent_name self.parent.name end …结果完全相同,我得到父文件夹的名称。但是,在getter方法中,如果我使用 def parent_name=(name) parent = self.cl

在rails模型中测试getter/setter对时,我发现了一个我一直认为奇怪且不一致的行为的好例子

在本例中,我处理的是
类文件夹

文件夹属于\u:parent,:class\u name=>“文件夹”

在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
。。。父项变为零,但如果我使用

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
是不一致的,我想更好地理解这一点,所以我不觉得我总是在猜测是否需要声明self。什么时候应该/不应该在ActiveRecord模型中使用self?

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

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

当谈到getter时,Ruby首先查看是否有一个局部变量,如果找不到,则尝试找到一个同名的方法,这就是为什么getter方法不使用“self”的原因

换句话说,这不是Rails的错,而是Ruby固有的工作方式


希望有帮助

复制的,,,,也复制了,其中“我是学习者,现在我是大师”;)哇,太好了。它作为一个getter工作,因为ruby找不到本地方法,所以会寻找一个方法。所以,换句话说,如果我指的是self,我应该使用self,而不是不使用self。哇,这是一个非常非常有用的解释。事实上,谢谢你的解释(还有写得很好的问题)。对ActiveRecord模型方法的动态特性的解释使这一点更加清晰。Ruby理解类的层次结构,但不一定理解那些通过方法\u动态生成或处理的方法。非常好的解释!救了我的命。尽管我现在仍然感到有点困惑,但我想我已经掌握了一些非常重要的概念,作为一个缓慢的学习者,我相信我很快就能理解你的全部解释,再次感谢你的精彩解释!