我有这样的代码:
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
答案 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])
负责更新关系。
此外,如果您将Oil
和OtherProducts
之间的关系定义为dependend: :destroy
,则Rails会处理相关记录的删除。