2017-10-11 13 views
1

私はこの問題を説明するためにこの例を構成しています。我々は次のモデルがあるとしましょう:accepts_nested_attributes_forを使用して同一のエンティティの複製が重複しないようにするにはどうすればよいですか?

class Case < ApplicationRecord 
    has_many :clients 
    accepts_nested_attributes_for :clients 
end 

class Client < ApplicationRecord 
    belongs_to :case 
    has_many :attorneys 
    accepts_nested_attributes_for :attorneys 
end 

class Attorney < ApplicationRecord 
    belongs_to :client 
end 

私は別のクライアントに同じ新しい弁護士を追加したいと思います。

私はケースを更新するには、このようなのparamsを使用する場合:

{ 
    "clients_attributes"=>{ 
    "0"=>{ 
     "id"=>"1", 
     "attorneys_attributes"=>{ 
     "123"=>{ 
      "name"=>"Joe" 
     } 
     } 
    }, 
    "1"=>{ 
     "id"=>"2", 
     "attorneys_attributes"=>{ 
     "456"=>{ 
      "name"=>"Joe" 
     } 
     } 
    } 
    } 
} 

Railsは同じ名前「ジョー」と二つの新しい弁護士レコードを作成します。私はちょうど1つのレコードを作成して、両方のクライアントに参照させたいと思います。 をまだ作成していないと参照するのが巧妙だったのですかレコード?

私ができることの1つは、サーバ側のパラメータを同一の名前でチェックし、アップデート後の作業を行うことです。簡単な方法がありますか?

+0

既存の弁護士を選ぶためのドロップダウン選択の使用についてはありますか? – DollarChills

+0

@DollarChills上記の例は、この問題を示すために作成されたものです。 –

答えて

0

RailsはIDを介して同じレコードであるかどうかをチェックします。したがって、ネストされたフィールドを使用していても弁護士のレコードを再利用する場合は、IDが同じであることを確認する必要があります。

一方、ネストされたフィールドを使用する理由は何ですか?通常、あなたは情報を更新するためにネストされたフォームを持っていますが、あなたのケースでは、クライアントモデルの下で弁護士の情報を更新することを意味します - そして、あるクライアントの下で弁護士を更新することは、 。

@DollarChillsはコメントに記されているように、クライアントの下で弁護士に選択フィールドを使用し、弁護士の情報を更新する別のページを作成してみませんか?

更新:あなたは一意にそのフィールドに基づいて、オートコンプリートフィールドを作成し、弁護士を識別することができます感じフィールドの場合、オートコンプリートソリューション

  1. 。たとえば、nameとしましょう。
  2. 名前にユーザーが入力したDBレコードが一致する場合は、読み込んでユーザーに選択させます。 create new attorneyオプションもあります
  3. ユーザーが弁護士を選択した場合は、アプリケーションに対応するIDを持つフォームに読み込んで、アプリケーションを更新するユーザーを知るようにします。
+0

例は、この問題を示すために作成されています。パラメタの作成時に新しく作成された弁護士のIDが存在しないため、「自分のIDが同じであることを確認できません」。 –

+0

@KeithCarter実際のユースケースは?特定のクライアントにとって、弁護士が既に存在する場合は、弁護士を再利用したいのですか? – songyy

+0

この場合、名前フィールドを自動完成させることができます。既存の弁護士が選択されると、ネストされたフィールドに自動的に記入された既存の弁護士がオートコンプリート – songyy

関連する問題