新手问题 使用 rails 的 migration 怎样将一个表中数据复制到另一个表

flypiggys · 2012年09月16日 · 最后由 fsword 回复于 2012年09月16日 · 3391 次阅读

将 product 中的 price 复制到 line_item 中,我是这样写的。

class AddPriceToLineItem < ActiveRecord::Migration
  def change
    add_column :line_items, :price, :decimal
    LineItem.all.each do |li|
      li.price = li.product.price
    end
  end
end

但是实际中发现 li.price 是得到了值的

p li.price   #<BigDecimal:99ca80c,'0.4375E2',18(45)>

但是 line_items 表中却没有数据

p LineItem.all
[#<LineItem id: 4, product_id: 2, cart_id: 3, created_at: "2012-09-15 17:48:50", updated_at: "2012-09-15 17:48:50", quantity: 1, price: nil>, #<LineItem id: 5, product_id: 3, cart_id: 3, created_at: "2012-09-15 17:48:55", updated_at: "2012-09-15 17:48:55", quantity: 1, price: nil>]

请问是何原因,如果想通过 migrate 复制表中的数据正确应该如何写?

  1. 你没li.save
  2. 别在 migration 里写这个

#1 楼 @hooopo 谢谢,已解决。是学 rails 时遇到的一个 migration 练习。数据库变更时对老的数据做一个兼容的处理,除了在执行迁移的时候做一个批量处理,还有什么更好的方法?

#2 楼 @flypiggys

将你的迁移写到 lib/tasks/下

task :your_task => :environment do #do something end

rake your_task

#2 楼 @flypiggys Migration 的设计关键不是"批量处理”,而是"可回溯",如果你用 change,最好确保里面的代码是可以 revert 的,否则难免滥用

需要 登录 后方可回复, 如果你还没有账号请 注册新账号