rails:has_and_belongs_to_many不保存关联对象(在连接表中为null)

时间:2014-11-28 11:35:02

标签: mysql ruby-on-rails rails-activerecord has-and-belongs-to-many

Rails 4.我有一个Authentication模型

class Authentication < ActiveRecord::Base
  ...
  has_and_belongs_to_many :posting_groups
  ...
end

PostingGroup型号

class PostingGroup < ActiveRecord::Base
  ...
  has_and_belongs_to_many :authentications
  ...
end

联接表的迁移如下所示:

def change
  create_table :authentications_posting_groups, id: false do |t|
    t.belongs_to :posting_group
    t.belongs_to :authentication
  end
end

AuthenticationPostingGroup表都不需要相互引用或引用连接表,因此其中没有相关信息。更新PostingGroups的{​​{1}}时,请执行以下操作:

Authentication

在执行def update @authentication.update_attributes(authentication_params) end def authentication_params params.require(:other_unimportant_stuff, posting_groups: []) end 操作期间,update如下:

  

{&#34;身份验证&#34; =&gt; {&#34; posting_groups&#34; =&gt; [&#34; 17&#34;,&#34; 18&#34;]},   &#34;东西&#34; =&gt;&#34;更多东西}

...其中,17和18是应保存的发布组的ID。实际上,params中的@authentication变量包含所需的updatePostingGroups返回true。但是,update_attributes(即实际存储在db中)返回一个空集。此外,检查Authentication.find(id).posting_groups表显示以下内容:

authentications_posting_groups

由于一些奇怪的原因,posting_group_id authentication_id 17 NULL 18 NULL 永远不会进入数据库,这很有趣,因为首先在此对象上触发了保存。这不是我第一次遇到这个问题,而是第二次,我们第一次注意到一切正常(也就是说,那些authentication_id没有在数据库中弹出)当< em>创建此方案中的内容是NULL,但同样的情况发生在Authentication上。在那个场合,实现了一个hack重新创建对象(在update上一切正常!),但这里不是一个选项。我非常感谢任何指针,因为这让我们发疯。感谢。

编辑 - 这是触发整个事情的形式:

create

2 个答案:

答案 0 :(得分:1)

您应该允许posts_group_ids并传递posting_group_ids

控制器

def update
  @authentication.update_attributes(authentication_params)
end
def authentication_params
    params.require(:other_unimportant_stuff, posting_group_ids: [])
end

查看

= form_for authentication, remote: true do |f|
  = f.select :posting_group_ids, options_for_select(@posting_groups.map {|pg| [ pg.name, pg.id ] }), {}, multiple: true, class: "form-control posting_groups_select"

答案 1 :(得分:0)

params.require(:other_unimportant_stuff, posting_group_ids: [])

注意ids。

根据您的参数传递posting_group_ids,但您的参数设置为posting_groups,因此强参数会将其过滤掉。