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

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

在 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/

相关文章:

ruby-on-rails - 我可以强制执行事件记录查询链吗?

javascript - 如何通过 Ajax 将表单数据提交到我的 Ruby Controller ?

ruby - 如何在 Rails 中获取电子邮件打开通知?

ruby-on-rails - 在 Rails3 中选择每天的平均不同值

ruby-on-rails-3 - Rails 3 - 搜查 - check_box_tag

ruby-on-rails - 保存模型时删除关联记录

ruby - 部署到 heroku 的 Watir 应用程序

ruby - 等待线程在 Ruby 中死亡

ruby - 如何从 ElasticSearch 结果集中排除带有 ids 的数组?

mysql - 如何通过连接表中的引用对查找记录?