1

我有这样的代码:

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
4

2 回答 2

2

other_products_cross_lists 是您的石油模型的关联。您不能在 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 之间的区别。

于 2013-07-30T09:07:22.893 回答
0

正如错误所说other_products_cross_lists的是一种关系(我假设你的模型oilhas_many other_products_cross_lists)。

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

我不太明白,你想对你做什么update_attribute,但如果用户嵌套属性,那么

@oil.update_attributes(params[:oil])

负责更新关系。

此外,如果您定义了您的关系,Oil并且Rails 处理相关记录的删除。OtherProductsdependend: :destroy

于 2013-07-30T09:09:06.157 回答