Rails db:migrate无法批量分配受保护的属性

时间:2013-06-07 00:58:28

标签: ruby-on-rails ruby database rake dbmigrate

我正在学习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行,但没有运气。

有人可以教我这里发生的事情吗?

3 个答案:

答案 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