Rails在update方法中更新相关的模型数据

时间:2013-07-30 08:58:51

标签: ruby-on-rails ruby

我有这样的代码:

def update
    @oil = Oil.find(params[:id])
    @product_types = ProductType.all    
    if @oil.update_attributes(params[:oil])
      if @oil.other_products_cross_lists.update_attributes(:cross_value => @oil.model.to_s.gsub(/\s+/, "").upcase)
        redirect_to admin_oils_path
      end
    else
      render :layout => 'admin'
    end
  end

但是当我运行它时,我得到:

undefined method `update_attributes' for #<ActiveRecord::Relation:0x007f7fb4cdc220>

我的other_products_cross_lists没有更新...我也尝试update_attribute并得到同样的错误。

我做错了什么?

当我运行我的销毁方法时

def destroy
    @oil = Oil.find(params[:id])
    if @oil.destroy
      if @oil.other_products_cross_lists.destroy
        redirect_to admin_oils_path
      end
    else
      render :layout => 'admin'
    end
  end

other_products_cross_lists没有销毁......

我该如何解决这个问题?

模型:

class Oil < ActiveRecord::Base
  has_many :other_products_cross_lists, :foreign_key => 'main_id'

class OtherProductsCrossList < ActiveRecord::Base
  belongs_to :oil

2 个答案:

答案 0 :(得分:2)

other_products_cross_lists是您的Oil模型上的关联。 您不能在Array或ActiveRecord:Relation对象上使用update_attributes。

你应该做的是

@oil.other_products_cross_lists.each {|list| list.update_attributes(:cross_value => @oil.model.to_s.gsub(/\s+/, "").upcase)}

用于销毁

你可以使用

@oil.other_products_cross_lists.delete_all

@oil.other_products_cross_lists.destroy_all

为了清楚起见,您应该查看delete_all和destroy_all之间的区别。

答案 1 :(得分:0)

错误说other_products_cross_lists是一种关系(我假设您的模型oil has_many other_products_cross_lists)。

update_attribute是模型实例的方法,而不是关系的方法。

我真的不明白,你想对你做什么update_attribute,但是如果是用户nested_attributes,那么

@oil.update_attributes(params[:oil])

负责更新关系。

此外,如果您将OilOtherProducts之间的关系定义为dependend: :destroy,则Rails会处理相关记录的删除。