常见的方法有 : create_table, drop_table, rename_table, change_table, table_exist?
详细如下:
最常见的创建表格: create_table(table_name, options={})
table_name 参数可以是字符串或者是符号(Symbol)类型。
create_table 可以使用普通的方式,或者块方式调用,一般使用块方式调用。
普通方式是先创建表,再添加字段,如下:
create_table(:users)
add_column(:users, :name, :string, {limit: 60})
同样的定义,使用块调用如下:
下面代码中 t 是一个 TableDefinition 对象
create_table(:users) do |t| t.column :name, :string, limit: 60 end
上面是调用了 t 对象的 column 对象来创建字段,然而更常用的是使用 t 对象的字段类型方法,如下:
create_table(:user) do |t| t.string :name, limit:60 end
这种会比之前的更简洁。
-----------
而 create_table 的第三个参数 opotions 是一个hash对象,可以指定下面这些key
:id
是否自动添加一个主键字段。默认是 true, 如果 join tables for has_and_belongs_to_many 这个值须设为 false
:primary_key
主键的名字,如果是自动生成主键,这个值是 id, 如果前面的 :id 指定为 false, 这一项就会被忽略。注意: Active Recode models 会自动选择他们的主键( id ), 如果要改变, 可以在 model 里面使用 self.primary_key= 方法来指定主键的名字。
:temporary
建立一张临时表。
:force
如果为 true, 则在创建表之前会删除它,默认值是false
:as
生成表的sql语句,当这一项被指定,后面的块就会被忽略,跟 :id 和 :primary_key 的关系差不多吧
指定数据库选项来生成SQL(MySQL)
create_table(:suppliers, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8')
生成的SQL如下:
CREATE TABLE suppliers ( id int(11) DEFAULT NULL auto_increment PRIMARY KEY ) ENGINE=InnoDB DEFAULT CHARSET=utf8
也可以不添加主键,如下:
create_table(:categories_suppliers, id: false) do |t|
t.column :category_id, :integer
t.column :supplier_id, :integer
end
生成的SQL如下:
CREATE TABLE categories_suppliers ( category_id int, supplier_id int )
也可以基于查询语句, 创建一张临时表:
create_table(:long_query, temporary:true, as: "SELECT * FROM orders Join line_items On order_id=orders.id")
生成的SQL如下:
CREATE TEMPORARY TABLE long_query AS SELECT * FROM orders INNER JOIN line_items ON order_id=orders.id
除了创建表格,我们还可以删除表格,删除表格的语法如下:
drop_table(table_name, options={})
注意到该方法除了指定要删除的 table 名字之外,还可以传入一个 options 参数。尽管这个方法可以省略options, 但是指定options 的好处是,如果这个方法写在 change 方法里面,这个操作就变成可逆的,这个options 将被用来 调用 create_table 方法。
身为程序员,起错表名是经常发生的事情,如果我们想要改变表的名字,可以使用 rename_table 方法,其格式如下:
rename_table(table_name, new_name)
除了修改表的名字之外,更多的情况是我们表内容我们需要改变,一般采用 change_table 方法来改, 其格式是:
change_table(table_name, options={})
一般通过传入块调用,类似如下几种:
添加字段
change_table(:suppliers) do |t| t.column :name, :string, limit: 60 end
也可以添加多个字段
change_table(:suppliers) do |t|
t.integer :width, height, null: false, default: 0
end
添加 created_at / updated_at
change_table(:suppliers) do |t|
t.timestamps
end
添加一个 foreign key 字段
change_table(:suppliers) do |t|
t.reference :company
end
添加一个 polymorphic foreign key 字段
change_table(:suppliers) do |t|
t.belongs_to :company, polymorphic:true
end
删除一个字段
change_table(:suppliers) do |t|
t.remove :company
end
删除多个字段
change_table(:suppliers) do |t|
t.remove :company_id
t.remove :width, :height
end
删除一个索引
change_table(:suppliers) do |t|
t.remove_index :company_id
end
还有一个很常见的方法,可以用来判断表是否存在的 table_exists? .
直接给表名就使用了,比如:
table_exists? :users # => 存在就返回 true , 否则返回 false