在已有的表里添加一个 quantity 字段,类型为 integer,默认值为 1。做法如下:
rails g migration add_quantity_to_line_items quantity:integer
这里没有什么问题,然后修改 migrate 文件,添加一个 default,代码如下:
class AddQuantityToLineItems < ActiveRecord::Migration
def change
add_column :line_items, :quantity, :integer, :default => 1
end
end
rake db:migrate
然后怎么:default => 1 没有生效呢?求指点迷津,谢谢!
写 migration 文件对已有表的已存在的数据不做改动的,你新增的数据会增加这个默认值 1.
最好的办法是除了写这个 migration 文件外,写一个 task,处理下现有的数据。
#7 楼 @Rei == AddQuantityToLineItems: reverting ========================================= -- remove_column(:line_items, :quantity, :integer, {:default=>1}) -> 0.0127s == AddQuantityToLineItems: reverted (0.0286s) ================================
== AddQuantityToLineItems: migrating ========================================= -- add_column(:line_items, :quantity, :integer, {:default=>1}) -> 0.0005s == AddQuantityToLineItems: migrated (0.0006s) ================================
用版本不一致的书和 Rails 学习,后面会有问题,不过这个没看出问题。
进数据库看看
$ sqlite3 db/数据库文件名
> .schema line_items
把结果贴上来。
default: 1
只会为新插入行指定默认的列值。已有行不做处理。对表定义做了变更,数据不会变的。
def up
add_column ...
LineItem.update_column(:quantity, 1)
end