has_many:through和accepts_nested_attributes_for复制记录

时间:2013-12-23 19:53:51

标签: ruby-on-rails ruby-on-rails-3 many-to-many nested-forms has-many-through

这是一款rails 3应用程序,令我感到困惑。我有这个:

class Coleta < ActiveRecord::Base
  has_many :coletas_produtos
  has_many :produtos, through: :coletas_produtos

  accepts_nested_attributes_for :produtos
end

class Produto < ActiveRecord::Base
  has_many :coletas
  has_many :coletas_produtos, through: :coletas
end

class ColetasProduto < ActiveRecord::Base
  belongs_to :produto
  belongs_to :coleta
end

当我尝试保存新的Coleta时,我这样做:

def create
  @coleta = Coleta.new(params[:coleta])

  respond_to do |format|
    if @coleta.save
      format.html { redirect_to(coletas_path, :notice => "Coleta cadastrada com sucesso.") }
    else
      format.html { render :action => "new" }
    end
  end
end

这是我的表格:

<%= form_for(@coleta) do |f| %>
  <%= f.fields_for :produtos do |p| %>
    <div class="field left">
      <%= p.label :codigo, "Código" %><br />
      <%= p.text_field :codigo %>
    </div>
  <% end %>
<% end %>

这是有效的,因为它在coletas_produtos表下创建了正确的记录。我的问题是我希望它只保存多对多关系,而不是produtos关系。

它会一直保存produtos表中的记录以及coletas_produtos上的记录。我想忽略并保留最新记录。

什么是最好的(有办法?)方式吗?

1 个答案:

答案 0 :(得分:1)

您的has_many...through关系定义需要进行一些调整。

# app/models/produto.rb
class Produto < ActiveRecord::Base
  has_many :coletas_produtos
  has_many :coletas, through: :coletas_produtos
end

请参阅“has_many :through”关系以了解正确的定义。

然后在ColetasController#new

# app/controllers/coletas_controller.rb
def new
  @coleta = Coleta.new
  @coleta.coletas_produtos.build |cp| do 
    @produto = cp.build_produto
  end
end

这将实例化Coleta的新实例,并在coletas_produtos操作中构建所有必需的关系,即关联的produtonew