has_many:通过和accepted_nested_attributes_for复制记录
问题描述:
这是一个rails 3应用程序,它让我感到困惑。我有这样的:has_many:通过和accepted_nested_attributes_for复制记录
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
上的记录。我想忽略并保留最新的记录。
什么是最好的(有没有办法?)的方式来做到这一点?
答
您的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
一个新的实例,并建立所有需要的关系,即在new
行动相关coletas_produtos
和produto
。
对于迟到的回复感到抱歉。我想到了。非常感谢:) – renatojf
@renatojf我有同样的情况。如果你分享你的解决方案,那将是非常棒的。 –