【问题标题】:Ruby on Rails Active associations clone and dup methodsRuby on Rails 主动关联克隆和复制方法
【发布时间】:2018-01-21 00:25:56
【问题描述】:

在我的 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: Validation failed: Employee must exist”错误。

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!

另一方面,当我使用“克隆”而不是“复制”时,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 方法之一。

我看不到我错过了什么。

有什么建议吗?

谢谢。

【问题讨论】:

  • 克隆模型的用例是什么?
  • 确实,这似乎不是您的讲师或老板打算使用的构建器模式。我会仔细检查,因为在这种情况下重复没有明确的价值。

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


【解决方案1】:

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

一般来说,复制的东西在附加到其他东西时会变得很棘手。从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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多