ActiveRecord::ConnectionAdapters::SchemaStatements | 有关Table 的常见方法笔记

常见的方法有 : 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

 

posted @ 2014-09-21 15:39  LaoQuans  阅读(285)  评论(0编辑  收藏  举报