0

我正在通过《Agile Web Development with Rails 4th edition》一书学习 Rails。

给定以下迁移代码:

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 行,但没有运气。

有人可以告诉我这里发生了什么吗?

4

3 回答 3

1

无法批量分配受保护的属性:数量

尝试 attr_accessible :quantity

您将需要列出该列表中的所有属性。

于 2013-06-07T01:04:20.877 回答
0

您需要使属性可访问。在模型中:

class Object ActiveRecord::Base
  attrib_accessible :attrib1, :attrib2, :attrib3
end

显然,您会用模型的属性替换 attrib1 等。

于 2013-06-07T01:06:11.447 回答
0

您尝试从迁移中访问质量属性。当您想从代码访问数据库表属性时,您需要允许批量分配该属性以告诉您的模型您可以通过代码为字段分配数据。对于这个目的,只需将所需的字段添加为 attr_accessible ,针对您的问题的特定解决方案如下:

类 LineItem < ActiveRecord::Base

attr_accessible:数量,:product_id,:cart_id

结尾

于 2013-06-07T05:33:42.903 回答