【发布时间】: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