私は 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 でまだ指定されていません。あらゆるご意見をお待ちしております。