Ruby on rails Rails:以嵌套形式操作联接表

Ruby on rails Rails:以嵌套形式操作联接表,ruby-on-rails,nested-forms,jointable,Ruby On Rails,Nested Forms,Jointable,我有两个通过联接表连接的模型: class Publication < ActiveRecord::Base attr_accessible :title, :author_attributes, :translator_attributes has_many :publication_contributors has_many :authors, :through => :publication_contributors, :source => :contrib

我有两个通过联接表连接的模型:

class Publication < ActiveRecord::Base
  attr_accessible :title, :author_attributes, :translator_attributes

  has_many :publication_contributors
  has_many :authors, :through => :publication_contributors, :source => :contributor,
    :conditions => {:publication_contributors => {:contributor_type => "Author"}}
  has_many :translators, :through => :publication_contributors, :source => :contributor,
    :conditions => {:publication_contributors => {:contributor_type => "Translator"}}

  accepts_nested_attributes_for :authors, :translators
end

class Contributor < ActiveRecord::Base
  attr_accessible :name

  has_many :publications, :through => :publication_contributors
  has_many :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  attr_accessible :contributor_type

  belongs_to :publication
  belongs_to :contributor
end
在我的控制器中:

def create
  publication = Publication.create(params[:publication])
end
表单按预期呈现,但在创建操作期间会发出劈啪声。我曾希望Rails能够根据出版物关联中的条件神奇地分配适当的贡献者类型,例如:

has_many :authors, :through => :publication_contributors, :source => :contributor,
:conditions => {:publication_contributors => {:contributor_type => "Author"}}
不幸的是,事实并非如此。我在创建过程中遇到此错误:

Mysql2::Error: Column 'contributor_type' cannot be null
这让我觉得我唯一的办法是在创建回调之前在
中手动分配contributor类型,但如果是这样,我如何确定要分配哪种类型?参数名称中的类型正确,例如:

publication[authors_attributes][0][name]
是否有某种方法可以访问模型层中的信息

更新:

我的
新建
操作:

def new
  @publication = Publication.new
  publication_contributor = @publication.publication_contributors.build
  contributor = publication_contributor.contributor.build
end
它在最后一行抛出此错误(设置
contributor
):


你能试试下面的吗

class Publication < ActiveRecord::Base
  attr_accessible :title, :publication_contributors_attributes

  has_many :publication_contributors
  has_many :authors, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Author' } }
  has_many :translators, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Translator' } }

  accepts_nested_attributes_for :publication_contributors
end

class Contributor < ActiveRecord::Base
  attr_accessible :name

  has_many :publications, through: :publication_contributors
  has_many :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  attr_accessible :contributor_type

  belongs_to :publication
  belongs_to :contributor

  accepts_nested_attributes_for :contributor
end

<%= form_for @publication, :remote => true do |f| %>

  <%= f.label :title %>:
  <%= f.text_field :title %>

  <%= f.fields_for :publication_contributors do |pc_form| %>
    <%= pc_form.hidden_field :contributor_type %>
    <%= pc_form.fields_for :contributor do |c_form| %>
      <%= c_form.label :name, "Author" %>:
      <%= c_form.text_field :name %>
    <% end %>
  <% end %>

  <%= f.submit %>
<% end %>

你能试着在表单上添加一个隐藏字段吗?我不确定这是否有帮助。
contributor\u type
属性在联接表中,而不是在contributor模型中。因为我实际上并没有在表单中声明联接表,所以我无法访问它的属性,即使使用隐藏字段也是如此。但是,如果有一种方法可以在表单中创建联接表,那么这种方法可能会起作用。我会调查的。如果你还有其他建议,请告诉我。你是对的。如果你先看一下《贡献者》杂志,然后再看《贡献者》杂志,可以吗?我会给你一个机会,看看效果如何。我不确定这是否可能。为了让它工作,我必须在PublicationContributor之外创建一个Contributor实例,如下所示:
publication\u Contributor.Contributor.new
。这会为nil:NilClass抛出一个
未定义的方法“new”
错误。我使用
.build
获得了相同的结果。我想知道ActiveRecord是否不支持从子级嵌套到父级。不要以任何方式提及这种情况。给了我这个机会,但我仍然得到构建错误。奇怪的是,类似的情况也适用于此。我已经更新了我的答案,告诉你控制器至少应该是什么样子:)当然!尽管我只创建了其中一个,但出版物贡献者仍然是一个协会。奇怪的是,我不能用
publication\u contributors=@publication.publication\u contributors.build
设置它,然后用
publication\u contributors.each
直接访问它。不过,您的代码工作得很好。谢谢!我无法直接访问出版物投稿人,这让我感到困惑。
undefined method `build' for nil:NilClass
class Publication < ActiveRecord::Base
  attr_accessible :title, :publication_contributors_attributes

  has_many :publication_contributors
  has_many :authors, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Author' } }
  has_many :translators, through: :publication_contributors, source: :contributor, conditions: { publication_contributors: { contributor_type: 'Translator' } }

  accepts_nested_attributes_for :publication_contributors
end

class Contributor < ActiveRecord::Base
  attr_accessible :name

  has_many :publications, through: :publication_contributors
  has_many :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  attr_accessible :contributor_type

  belongs_to :publication
  belongs_to :contributor

  accepts_nested_attributes_for :contributor
end

<%= form_for @publication, :remote => true do |f| %>

  <%= f.label :title %>:
  <%= f.text_field :title %>

  <%= f.fields_for :publication_contributors do |pc_form| %>
    <%= pc_form.hidden_field :contributor_type %>
    <%= pc_form.fields_for :contributor do |c_form| %>
      <%= c_form.label :name, "Author" %>:
      <%= c_form.text_field :name %>
    <% end %>
  <% end %>

  <%= f.submit %>
<% end %>
@publication.publication_contributors.build
@publication.publication_contributors.each do |pc|
  pc.build_contributor
end