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