Ruby on Rails主动关联clone和dup方法

时间:2017-08-12 17:16:09

标签: ruby-on-rails ruby activerecord clone dup

在我的ruby on rails应用程序中,我遇到了一个问题,而我在克隆它之后尝试保存模型。我有以下型号。

class Company < ApplicationRecord

    has_many :employees

end

class Employee < ApplicationRecord

    belongs_to :company
    has_one :user   

end

class User < ApplicationRecord

    belongs_to :employee

end

当我使用以下代码时,我得到了ActiveRecord :: RecordInvalid:验证失败:员工必须存在&#39;错误。

company = Company.new
employee = Employee.new(company: company)
user = User.new(name: 'John',email:   'example@gmail.com',password: 'password')
user.employee = employee

u = user.dup

u.save!

另一方面,当我使用克隆&#39;而不是&#39; dup&#39; Rails尝试两次保存用户模型,这导致异常

company = Company.new
employee = Employee.new(company: company)
user = User.new(name: 'John',email:   'example@gmail.com',password: 'password')
user.employee = employee

u = user.clone

u.save!  

如果我保存模型而不进行加密和克隆,则没有问题。在我的应用程序中,我使用构建器模式并且必须使用dup或clone之一。

我无法看到我失踪的东西。

有什么建议吗?

感谢。

1 个答案:

答案 0 :(得分:0)

在这两种情况下,问题都是你在复制之前所做的关联。这是很难做到的事情之一,因为在现实世界中有更好的方法来处理它。

一般情况下,重复的东西在附加到其他东西时会变得粘稠。从clone这样的命令中不清楚你还想要复制哪些附件,以及在哪些方面附带的内容以及附加的内容是什么?这就是为什么你必须编写更明确的代码。

正如this answer所解释的那样,dup不会复制关联。使用clone,您的原始用户和克隆都会附加到同一个员工。我无法想象,如果将这样的东西变成真实的话,这将是你的意图,实际上它会将活动记录混淆为将保存级联到原始对象。

您更有可能为每个重复的user创建一名新员工,因此请在重复之后处理该步骤。

但是,如果所有用户确实属于同一个员工(或者您需要与company之类的更可靠的模板值建立关联),那么您可以预先创建该数据库记录然后参考它明确地作为记录而不是红宝石对象。

 company = Company.new
 employee = Employee.create!(company: company)
 user = User.new(name: 'John', 
                 email: 'example@gmail.com',
                 password: 'password', 
                 employee_id: employee.id)

 u = user.dup

 u.save!
相关问题