新手问题 关于 ruby 的变量问题

dxwts · 2013年12月26日 · 最后由 dxwts 回复于 2013年12月26日 · 2264 次阅读

请教,代码如下,我需要记录 product 表的字段变更历史,就用了 mongoid 提供的 after_update 方法,但是在保存前取到的 self 的字段都是更新过的,没办法就添加了 set_old_product 的方法,在 controller 里设置,在 set_old_product 里打印的值还是变更前的没问题,可执行到 after_update 时就@old_product就变成变更后的了,set_old_product 这个方法只被调用了一次,是不是我的变量使用方法不对?感觉@old_product只是存了 product 的指针一样

class Product
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, type: String
  field :state, type: String

has_many :product_events, :after_add => :after_add_handler,  :dependent => :destroy

after_update do |product|
      puts "=============== #{@old_product.state}, #{product.state}" #到这里前后两个值就变成一样了
end

  def set_old_product(product)
    @old_product = product.attributes
     puts "=============== #{@old_product.state}"  #这里打印的值还是对的
  end

def create_events
......
end
end

你的感觉没错 Ruby 只对于基本类型比如数字是进行拷贝的(Symbol 无需拷贝),其他所有类型均是引用。

#1 楼 @iBachue 哦,原来如此,谢谢

#2 楼 @dxwts ActiveModel Dirty 也许可以帮到你

product.attributes.dup

#3 楼 @iBachue 好的,原来不用我自己处理

#4 楼 @jjym 谢谢,现在是这样写的

#3 楼 @iBachue ActiveModel Dirty 这个方便多了,非常感谢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册