0

这是一个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上的记录。我想忽略并保留最新的记录。

什么是最好的(有没有办法?)的方式来做到这一点?

回答

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一个新的实例,并建立所有需要的关系,即在new行动相关coletas_produtosproduto

+0

对于迟到的回复感到抱歉。我想到了。非常感谢:) – renatojf

+0

@renatojf我有同样的情况。如果你分享你的解决方案,那将是非常棒的。 –

相关问题