2017-08-12 19 views
1

Ruby on Railsアプリケーションで、モデルをクローンした後にモデルを保存しようとしているときに問題があります。私は以下のモデルを持っています。Ruby on Railsのアクティブな関連付けクローンとdupメソッド

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は二回Userモデルを保存しようと、私はduppingおよびクローニングせずにモデルを保存する場合、これは例外

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! 

をリード問題はない。私のアプリケーションでは、ビルダーパターンを使用しており、dupまたはcloneのメソッドの1つを使用する必要があります。

私には何が欠けているのか分かりません。

提案がありますか?

ありがとうございました。

+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! 
関連する問題