论坛首页 编程语言技术论坛

Rails中的Migrations(二)

浏览 1999 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (18)
作者 正文
   发表时间:2008-11-19  

刨析Migrations:

 之前提到过,migrate其实就是rb代码, 因此每个migrate文件都包含一个rb class.这个class是ActiveRecord::Migration的子类,在这个类中至少应该包含两个类方法:up和down.up方法会执 行相应的更改数据库结构的方法,而down方法则会undo up中的改动.

增加字段:

当需要对某张表添加某个字段时,可以使用ActiveRecord::Migration中的add_column方法,典型的add_column方法如以下这些实例:
add_column :orders, :attn, :string, :limit => 100
add_column :orders, :order_type, :integer
add_column :orders, :ship_class, :string, :null => false, :default => 'priority'
add_column :orders, :amount, :decimal, :precision => 8, :scale => 2
add_column方法签名为:add_column (table_name, column_name, type, options = {})在最后参数options hash中可以使用以下key对column进行额外的定义:
:limit               =>          定义该字段的长度
:default          =>           定义该字段的默认值
:null               =>          该字段是否允许为空
:precision      =>           该字段的有效数字长度
:scale              =>           该字段小数点后的数字长度

改变字段名称:

如果需要对某张表的某个字段进行改名,可以使用rename_column方法.改方法的签名如下:rename_column (table_name, column_name, new_column_name),例子如下:
rename_column :orders, :e_mail, :customer_email 
将orders表中的e_mail字段改名为customer_email.
需要注意的是rename_column方法只会改变字段的名称,而不会修改该字段的依赖限制关系,例如主外键关系等.还有就是该方法并不是所有数据库都支持该方法.

改变字段类型和属性:
使用change_column方法可以改变指定字段的类型和相关属性,它的使用方法和签名与add_column方法类似,范例代码如下:
change_column :orders, :order_type, :string, 假设orders表中的order_type字段原本是integer类型,现在改为string类型.
需 要注意的是,在down方法中会将up方法中的改变undo回来,但是如果up中的改变是单向的,则undo时该字段的值就会丢失.例如,当 order_type由integer类型改成string后,可以插入类似"new", "existing"等内容.但是如果要执行down方法将该字段由string改回integer时,由于"new"等内容无法被转化为 integer,所以这些字段的内容就会丢失.
因此如果想建立一个单向的migration,则可以在down方法中直接throw一个Rails内部的exception,代码如下:

def self.down
  raise ActiveRecord::IrreversibleMigration
end
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics