2017-08-12 83 views
1

在我的ruby on rails應用程序中,我試圖在克隆後保存模型時出現問題。我有以下模型。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:驗證失敗:員工必須存在「的錯誤。

company = Company.new 
employee = Employee.new(company: company) 
user = User.new(name: 'John',email: '[email protected]',password: 'password') 
user.employee = employee 

u = user.dup 

u.save! 

在另一方面,當我使用的不是「DUP」 Rails的「克隆」試圖保存用戶模式的兩倍,這導致例外

company = Company.new 
employee = Employee.new(company: company) 
user = User.new(name: 'John',email: '[email protected]',password: 'password') 
user.employee = employee 

u = user.clone 

u.save! 

如果我保存模型,而不會dupping和克隆,沒有問題。在我的應用程序中,我使用了構建器模式,並且必須使用dup或clone方法之一。

我看不到我想念的東西。

有什麼建議嗎?

謝謝。

+0

您的克隆模型的用例是什麼? – teacher

+0

事實上,看起來這可能不是您的教師或老闆打算使用的建造者模式。我會仔細檢查,因爲在這種情況下,複製沒有明確的價值。 – Adamantish

回答

0

在這兩種情況下,麻煩都是你在複製之前所做的關聯。這是很難做到的事情之一,因爲在現實世界中有更好的方法來處理它。

一般情況下,複製東西會粘到其他東西上時變得粘滯。從clone這樣的命令中不清楚哪一個附件還要複製,以哪種方式附加到這些附件上?這就是爲什麼你必須寫更多明確的代碼。

由於this answer解釋,dup不復制關聯。使用clone您的原始用戶和克隆都將附加到同一位員工。我無法想象這會是你的意圖,如果這樣做是真實的,而且事實上它會將活動記錄混淆成級聯保存回原始對象。

您希望爲每個重複的user創建新員工的可能性更大,因此在重複之前處理該步驟之前不會。但是,如果所有用戶真的應該屬於同一個員工(或者您需要與一些更可信的模板值(如company)進行關聯),那麼您可以預先創建該數據庫記錄,然後明確地將其引用爲一個記錄而不是一個紅寶石對象。

company = Company.new 
employee = Employee.create!(company: company) 
user = User.new(name: 'John', 
       email: '[email protected]', 
       password: 'password', 
       employee_id: employee.id) 

u = user.dup 

u.save!