【问题标题】:Unable to copy Ruby object's attributes无法复制 Ruby 对象的属性
【发布时间】:2011-07-27 10:00:36
【问题描述】:

我有一个非常痛苦的问题,如果有人可以帮忙?

我有一个带有属性的类任务,我想做一个 bang 方法(因为我正在更改接收器)但我无法正确更改对象属性:

def reject!
    return nil if self.previous_owner.nil?
    self.delegate = false

    # Before, owner equal a User object
    self.owner = self.previous_owner # previous_owner is also a User object, but different
    self.previous_owner = nil

    return self if self.save
    raise "Can't save object"
end

这行不通,因为 self.owner 将为零... 我知道这是因为告诉 Ruby self.owner = self.previous_owner 然后将 self.previous_owner 更改为 nil。

那么我怎样才能避免这种情况呢?我尝试了 clone 和 dup 方法,但我不确定是否要复制一个新的 User 对象...

如果我在 Rails 控制台中尝试这个,也很奇怪:

a = 'Foo'
b = a
a = 'New value'

puts a # "New value"
puts b # "Foo"

所以我觉得我错过了什么......

【问题讨论】:

  • 所有者的访问器方法是什么样的 - 那里发生了什么非标准的事情?还是用户对象中的@= 方法?试试@owner 而不是self.owner?试试self.owner, self.previous_owner = self.previous_owner, nil

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

请注意self.ownerself.previous_owner 是Rails 提供的便捷方法。实际字段应称为 owner_idprevious_owner_id 之类的名称,并包含您要链接到的 User 的实际 ID。

因此,一种更简单且故障安全的方法是编写

self.owner_id = self.previous_owner_id
self.previous_owner = nil # this will unlink the previous owner
self.save!

如果保存失败,self.save! 会触发。

【讨论】:

  • 谢谢它的工作原理!但是,您知道在调用 reject 后如何停止执行 myObject.reload 吗?还是这样做很正常?
  • 备注:在 ruby​​ 中,我们没有驼峰式变量。它被认为是丑陋的:) 如果您需要在拒绝后访问owner,而您之前访问过owner,则确实需要reload
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多