2

私は Rails 第 4 版 (Rails 3.2+) を使用してアジャイル Web 開発に取り組んでおり、移行について質問がありました。既存のテーブルに列を追加し、その新しい列を値で更新する演習があります。「価格」列を「line_items」テーブルに追加する必要があります。最初に移行を生成しました:

rails generate migration add_price_to_line_items price:decimal

次に、移行ファイルを編集しました。

class AddPriceToLineItems < ActiveRecord::Migration
  def change
    add_column :line_items, :price, :decimal

    LineItem.all.each do |li|
      li.price = li.product.price
    end
  end

  def down 
    remove_column :line_items, :price
  end
end

すべてが計画どおりに機能しましたが、attr_accessible について質問がありました。編集するには、オブジェクトのすべての属性を attr_accessible で指定する必要があることを理解しています。そうでない場合、通常は次のエラーが発生します。

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: product

そのため、すべての属性は、関連付けられたモデルで attr_accessible のパラメーターとして設定する必要があります。

class LineItem < ActiveRecord::Base
  **attr_accessible :cart_id, :product_id, :quantity**
  belongs_to :cart
  belongs_to :product

  def total_price
    product.price * quantity
  end

end

これが正しい場合、移行によって新しく生成された列をどのように更新できたのでしょうか? 列が生成されたばかりの場合、その新しい属性は、関連付けられたモデルの attr_accessible でまだ指定されていません。あらゆるご意見をお待ちしております。

4

2 に答える 2