首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候在Model中使用self?

什么时候在Model中使用self?
EN

Stack Overflow用户
提问于 2012-05-30 03:06:09
回答 3查看 31.7K关注 0票数 79

问:什么时候我需要在Rails的模型中使用self?

我的一个模型中有一个set方法。

代码语言:javascript
复制
class SomeData < ActiveRecord::Base
  def set_active_flag(val)
    self.active_flag = val
    self.save!
  end
end

当我这样做的时候,一切都很好。然而,当我这样做的时候:

代码语言:javascript
复制
class SomeData < ActiveRecord::Base
  def set_active_flag(val)
    active_flag = val
    save!
  end
end

active_flag的值不会改变,而是静默地失败。有人能解释一下吗?

我找不到任何副本,但如果有人找到一个也没问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-30 03:09:26

当您在调用该方法的实例上执行操作时,可以使用self。

使用下面的代码

代码语言:javascript
复制
class SocialData < ActiveRecord::Base
  def set_active_flag(val)
    active_flag = val
    save!
  end
end

您正在定义一个名为active_flag的全新作用域局部变量,将其设置为传入的值,它与任何东西都没有关联,因此当方法结束时,它会立即被丢弃,就像它从未存在过一样。

代码语言:javascript
复制
self.active_flag = val

但是会告诉实例修改它自己的名为active_flag的属性,而不是一个全新的变量。这就是它工作的原因。

票数 75
EN

Stack Overflow用户

发布于 2012-05-30 03:10:14

这是为了确保你使用的是setter方法,而不是一个新变量的作用域。这是Ruby和AR的用法细节,经常会让人犯错(另一个是(误用)实例变量)。

注意,已经有了update_attributes!,尽管我理解抽象的愿望。

还有toggle!,它可能更好,这取决于您对标志的接口。

票数 2
EN

Stack Overflow用户

发布于 2017-10-30 23:30:52

当使用active_flag = val ruby时,如果你认为你是在定义一个局部变量,最好的方法是self.active_flag = val,如果你得到了它,希望你知道send(:active_flag=, val)也会工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10805136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档