• 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
  • 相关阅读:
    Memcached存储溢出
    Memcached windows安装
    Memcached简介
    HTTP请求中怎样选择Get和Post方式
    【cogs 597】【dp】交错匹配
    <LeetCode OJ> 58. Length of Last Word
    codevs1051
    最重要的 Java EE 最佳实践
    android-xBuild apk差分与合成,zip差分与合成,lua打包,apk打包,png/jpg图片压缩
    [Phonegap+Sencha Touch] 移动开发26 Android下的sencha touch程序,转屏时,Ext.Viewport不能触发orientationchange事件的解决的方法
  • 原文地址:https://www.cnblogs.com/laoquans/p/3984593.html
Copyright © 2020-2023  润新知