这是一款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
上的记录。我想忽略并保留最新记录。
什么是最好的(有办法?)方式吗?
答案 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
操作中构建所有必需的关系,即关联的produto
和new
。