我正在学习Rails,其中包含Agile Web Development with Rails第4版。
考虑下面的迁移代码:
class CombineItemsInCart < ActiveRecord::Migration
def up
Cart.all.each do |cart|
sums = cart.line_items.group(:product_id).sum(:quantity)
sums.each do |product_id, quantity|
if quantity > 1
cart.line_items.where(product_id: product_id).delete_all
cart.line_items.create(product_id: product_id, quantity: quantity)
end
end
end
end
def down
LineItem.where("quantity>1").each do |line_item|
line_item.quantity.times do
LineItem.create(cart_id: line_item.cart_id, product_id: line_item.product_id, quantity: 1)
end
line_item.destroy
end
end
end
发生以下错误:
== CombineItemsInCart: migrating =============================================
rake aborted!
An error has occurred, this and all later migrations canceled:
Can't mass-assign protected attributes: quantity/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:9:in `block (2 levels) in up'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:6:in `each'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:6:in `block in up'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:3:in `each'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:3:in `up'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
现在我在某处读过这本书是在默认情况下需要attr_accessible之前编写的,但它还没有真正触及如何正确使用它。我尝试将:line_item或:line_items添加到Cart模型中的attr_accessible行,但没有运气。
有人可以教我这里发生的事情吗?
答案 0 :(得分:1)
无法批量分配受保护的属性:数量
尝试attr_accessible:数量
您需要列出该列表中的所有属性。
答案 1 :(得分:0)
您需要使属性可访问。在模型中:
class Object ActiveRecord::Base
attrib_accessible :attrib1, :attrib2, :attrib3
end
显然你会用模型的属性替换attrib1等。
答案 2 :(得分:0)
您尝试从迁移中访问大量属性。如果要从代码中访问数据库表属性,则需要允许对该属性进行批量分配,以告知模型您可以通过代码为字段分配数据。对于此pusrpose,只需将所需字段添加为attr_accessible,并针对您的问题特定解决方案:
类LineItem&lt;的ActiveRecord ::基
attr_accessible:quantity,:product_id,:cart_id
端