在before_save挂钩中更改ActiveRecord属性值

fif*_*uri 4 ruby activerecord ruby-on-rails

我需要修复ActiveRecord属性的编码,并决定在before_save挂钩中执行此操作.此时我发现了一个意想不到的功能.当我想要更改属性的值时,使用简单的方法attribute_name=XY并不像我预期的那样工作.而不是我需要使用self[:attribute_name]=XY.到目前为止我还没有认识到这种行为AR.attribute_name=XY.这是什么原因?这种行为是否与钩子或其他东西有关?谢谢你的解释.

Fra*_*eil 8

这实际上是一个Ruby"功能":

def value=(x)
  p x
end

def run
  value = 123
end

run
# => 123
Run Code Online (Sandbox Code Playgroud)

在上面的#run中,执行值会分配一个局部变量,而不是其他任何东西.如果你想调用#value =,你必须指定接收者:

def run
  self.value = 123
end

run
123
# => nil
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!