在before_save挂钩中更改ActiveRecord属性值

时间:2010-03-12 02:09:30

标签: ruby-on-rails ruby activerecord

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

1 个答案:

答案 0 :(得分:8)

这实际上是一个Ruby“功能”:

def value=(x)
  p x
end

def run
  value = 123
end

run
# => 123

在上面的#run中,执行值会分配本地变量,而不是其他任何变量。如果你想调用#value =,你必须指定接收者:

def run
  self.value = 123
end

run
123
# => nil

希望这有帮助!