【问题标题】:Rails 3 Active Record object re-initializeRails 3 Active Record 对象重新初始化
【发布时间】:2012-10-19 20:42:52
【问题描述】:

我有一个旧用户对象和一个新用户对象。 我正在尝试创建一个新的用户对象,并希望将所有属性分配给旧用户对象并保持 id(主键)相同,而不在用户表中创建新行。

old_user = User.find(20)
old_user.id # this is 20
old_user.name # this displays "old_name"
new_user = User.new
new_user.name = "new_name"
old_user = new_user
old_user.save # this doesn't work since the new_user.id is nil and so is old_user.id is nil
old_user.id = 20 and save #this won't work either.

如何将 new_user 的状态保存到 old_user 对象但保持相同的主键 ID。

【问题讨论】:

  • 为什么需要新建用户?不能只更新 old_user 的属性吗?
  • 因为new_user有很多属性和关联,所以将new_user的状态保存到old_user而不是更新old_user是有意义的
  • 有一个答案对我有帮助,但它被删除或被删除,是 V 的东西

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


【解决方案1】:

据我所知,您不需要新的用户对象。有几种方法可以更新 ActiveRecord 对象的属性:

user = User.find(20)
user.name = "new_name"
user.save # returns true if successful

你可以传入一个哈希值来一次更新多个属性:

user = User.find(20)
user.update_attributes(name: "new_name", email: "new_email@email.com")

【讨论】:

  • 谢谢,我知道我可以做 user.name = "new_name" 但是否可以将 new_user 传递给 update_attributes?像 user.update_attributes(new_user.attributes)
  • 也许您应该告诉我们一些您的用例。为什么要创建新用户?
【解决方案2】:

你的问题很容易回答,但就像 Zach Kemp 上面所说的那样,你应该描述你的用例,这样也许有人可以提出更好的方法来做你想做的事。

无论如何,这会做你想做的。

old_user = User.find(20)
new_user = User.new(old_user.attributes)
new_user.save!

【讨论】:

    【解决方案3】:

    如果这是你想要的,ruby 中的 clone 方法可以解决问题。它还会克隆 id

    new_user = old_user.clone
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多