在模型中使用self.attribute和attribute有什么区别?

Som*_*Guy 18 ruby ruby-on-rails

在Ruby on Rails中,在模型中使用self.attribute和attribute之间的区别是什么?

在此示例中,假设my_attr是存储在数据库中的用户的属性.

class User < ActiveRecord::Base
  def do_something!
    self.my_attr = 123
  end

  def do_another_thing!
    my_attr = 456
  end
end
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 23

区别在于一个有效,另一个没有 - 或者至少不是你想要的.

你的第二个版本没有做任何事情.它不等同于调用self.my_attr = 123,而是简单地创建一个被调用的局部变量my_attr并将其设置为123,然后在方法返回时将其抛出.它不会my_attr以任何方式影响模型的价值.

class User < ActiveRecord::Base
  def do_another_thing!
    my_attr = 456

    puts self.my_attr # nil (or whatever value it was before)
  end
end
Run Code Online (Sandbox Code Playgroud)

相反,如果要访问在对象上定义的方法,则可以(并且应该)省略self:

class User
  def name=(value)
    @name = value
  end

  def name
    @name
  end

  def age=(value)
    @age = value
  end

  def age
    @age
  end

  def do_something
    self.name = "bob" # self is required
    puts name # bob (self.name)

    age = 47 # @age is unaffected
    age # 47 (local variable), but self.age is nil 

  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,这不是Rails问题,而是一个Ruby问题.这里没有特定于Rails的代码,这种行为是Ruby语法工作方式的一部分.

  • 好,谢谢。为什么当你想要获取名称时建议不要使用 self.name ,而当你想要设置名称时使用 self.name ?我想你会想在这两种情况下使用 self.name ,以保持一致性。 (2认同)