【问题标题】:nested fields with has_many through relationship - duplicate incomplete records具有 has_many 关系的嵌套字段 - 重复不完整的记录
【发布时间】:2016-01-11 16:00:34
【问题描述】:

我有当前的模特关系:

class Group < ActiveRecord::Base
  has_many :group_memberships, dependent: :destroy
  has_many :subjects, through: :group_memberships
  has_many :entries, through: :group_memberships
  accepts_nested_attributes_for :group_memberships, allow_destroy: true

class GroupMembership < ActiveRecord::Base
  belongs_to :group
  belongs_to :subject
  belongs_to :entry

class Issue < ActiveRecord::Base
  has_many :group_memberships, through: :entries, dependent: :destroy
  has_many :groups, through: :group_memberships, dependent: :destroy
  accepts_nested_attributes_for :group_memberships, allow_destroy: true, reject_if: :all_blank
  accepts_nested_attributes_for :groups, allow_destroy: true

使用 cocoon 嵌套字段和 simpleform - 当我添加或更新现有对象时 - 创建了两个不完整的 group_membership 记录(即它们将所需的外键拆分为两个模型。

这与我通常使用的关联之间的唯一区别是在这种情况下连接表具有三个外键而不是两个。

SQL 查询:

INSERT INTO `groups` (`name`, `created_at`, `updated_at`) VALUES ('test group', '2016-01-11 15:53:22', '2016-01-11 15:53:22')
INSERT INTO `group_memberships` (`subject_id`, `group_id`, `created_at`, `updated_at`) VALUES (16, 18, '2016-01-11 15:53:22', '2016-01-11 15:53:22')
INSERT INTO `group_memberships` (`entry_id`, `group_id`, `created_at`, `updated_at`) VALUES (20, 18, '2016-01-11 15:53:22', '2016-01-11 15:53:22')

控制器里的参数好像正常:

"groups_attributes"=>{"1452527593321"=>{"name"=>"test group", "subject_ids"=>["", "16"], "_destroy"=>"false"}}, "_destroy"=>"false", "id"=>"20"}

当参数显示正常时,为什么我要处理重复的不完整查询,我真的有点迷茫

表单本身如下所示:

<div id="groups">
  <div id="groups_from_list">
      <%= f.simple_fields_for :groups do |group| %>
        <%= render 'group_fields', :f => group %>
      <% end %>
  </div>
  <%= link_to_add_association 'add a group', f, :groups, :class => 'btn btn-primary btn' %>
</div>

通过使用嵌套形式的关联,我对标准 has_many 没有任何问题 - 但我认为 group_membership 连接表中的三个外键会导致问题。

**Group Fields Partial**

<div class="nested-fields">
  <%= f.input :name , input_html: { class: 'form-control-small' }, label: "Group name" %>
  <%= f.association :subjects,
                      include_blank: false,
                      label_method: :full_name,
                      label: "Attendees",
                      collection: Subject.order(:last_name),
                      input_html: { class: 'select2-issue-X' },
                      placeholder: "add attendees" %>
  <%= link_to_remove_association "remove", f, :class => 'btn btn-danger btn-xs'%>
</div>

【问题讨论】:

  • 你能显示group_fields 部分吗?我在发布到控制器的参数中没有看到entry_id,因此我不清楚发布的一组(有两个subject_ids)如何导致您显示的group_memberships 的两个插入。跨度>
  • 我用部分更新了原始帖子。我确实很困惑,因为参数中没有entry_id - 但不知何故,两个不完整的group_memberships 记录之一有一个正确的entry_id。如果我手动将两条记录合并在一起 - 一切似乎都正常
  • 视图中没有entry_id?你是怎么设置的?
  • 最初我添加了一个隐藏字段来提供 entry_id - 但这样做会产生以下错误ActiveRecord::UnknownAttributeError (unknown attribute 'entry_id' for Group.)。更让我困惑的是,Activerecord 能够为其中一个记录创建推断出正确的 entry_id,而无需任何隐藏字段(如我原始帖子中的第三个 SQL 查询所示。
  • Mmmmmm 你的控制器代码看起来如何?我认为您应该考虑创建 group_memberships 而不是直接尝试将 subjects 添加到组中。或者您的控制器代码将尝试设置entry_id。从您现在显示的代码来看,rails 无法自动设置entry_id

标签: ruby-on-rails-3 ruby-on-rails-4 activerecord cocoon-gem


【解决方案1】:

我通过使用不同的模型关系解决了这个问题 - 我在原始帖子中使用的模型关系似乎不受标准嵌套字段实现的支持 - 尽管它可能可以通过覆盖控制器和模型代码来解决。

class Group < ActiveRecord::Base
  has_many :group_memberships, dependent: :destroy
  has_many :subjects, through: :group_memberships

class GroupMembership < ActiveRecord::Base
  belongs_to :group
  belongs_to :subject

class Issue < ActiveRecord::Base
  has_many :groups, through: :entries
  has_many :group_memberships, through: :groups, dependent: :destroy
  accepts_nested_attributes_for :groups, allow_destroy: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2015-05-16
    相关资源
    最近更新 更多