如何使用accepts_nested_attributes_for避免重复的相同实体创建?

时间:2017-10-11 02:44:41

标签: ruby-on-rails ruby-on-rails-5

为了展示我的问题,我正在编写这个例子。假设我们有以下模型:

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

我想将 相同的 律师添加到不同的客户。

如果我使用这样的参数来更新案例:

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

Rails将创建两个同名“Joe”的新律师记录。我想创建一条记录并让两个客户都参考它。是否有一些聪明的是引用尚未创建的记录?

我能做的一件事是检查服务器端的参数是否有相同的名称,并进行一些更新后的工作。有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

Rails通过ID检查它是否是相同的记录。因此,如果您使用嵌套字段,但想重复使用律师记录,则需要确保其ID相同。

另一方面,为什么要使用嵌套字段?通常你有一个嵌套的表格来更新信息,但对于你的情况来说......这意味着更新任何客户模式下的律师信息 - 以及更新一个客户的律师,实际上会影响其他客户下的所有律师

正如@DollarChills在评论中提到的那样,为什么不在客户下为律师使用选择字段,并创建一个单独的页面来更新律师信息?

更新:自动完成解决方案

  1. 对于您认为可以唯一标识律师的字段,请根据该字段创建自动填写字段。我们以name为例
  2. 如果用户输入的名称与某些DB记录匹配,请加载并让用户选择。您还有create new attorney选项
  3. 如果用户选择了律师,只需将其加载到具有相应ID的表单中,以便您的应用知道要更新的人。