• rails之 Migrations (转)


    1.简介

    在rails中用migration可以很方便的管理数据库的结构。可以创建数据库,创建表,删除表,添加字段,删除字段,整理数据。

    migration就是一系列的class,这些类都继承了ActiveRecord::Migration类。

    class CreateProducts < ActiveRecord::Migration 
      def up 
        create_table :products do |t| 
          t.string :name 
          t.column :description, :text 
          t.timestamps 
        end 
      end 
         
      def down 
        drop_table :products 
      end  
    end

    上面就是一个migration例子。up方法中的代码会在

    rake db:migrate

    之后执行。

    down方法中的代码会在

    rake db:rollback

    之后执行。

    t.timestamps会自动产生created_at和updated_at列。

    还可以进行表结构修改。

    class AddReceiveNewsletterToUsers < ActiveRecord::Migration 
      def up 
        change_table :users do |t| 
          t.boolean :receive_newsletter, :default => false
        end 
        User.update_all ["receive_newsletter = ?", true] 
      end 
          
      def down 
        remove_column :users, :receive_newsletter 
      end 
    end

    rails3.1之后产生了一个新的方法change,主要用来创建表和列,不用写一对up和down了,使用rake db:rollback回滚的时候数据库不用down方法也知道如何做了。

    1.1.migration提供了很多的方法

       add_column
       add_index
       change_column
       change_table
       create_table
       drop_table
       remove_column
       remove_index
       rename_column

    如果想回滚migration对数据库造成的改变,可以使用rake db:rollback命令。

    1.2.ActiveRecord支持的列类型

       :binary
       :boolean
       :date
       :datetime
       :decimal
       :float
       :integer
       :primary_key
       :string
       :text
       :time
       :timestamp

    2.创建migration

    2.1.创建model

    rails generate model Product name:string description:text

    创建的migration文件位于db/migrate目录,文件名称为yyyymmddmmss_create_products.rb。

    class CreateProducts < ActiveRecord::Migration 
      def change 
        create_table :products do |t| 
          t.string :name 
          t.text :description 
          
          t.timestamps 
        end 
      end 
    end

    2.2.创建单独的migration

       rails generate migration AddPartNumberToProduct

    class AddPartNumberToProducts < ActiveRecord::Migration 
      def change 
      end 
    end

    指定列的名称

       rails generate migration AddPartNumberToProduct part_number:string

    class AddPartNumberToProducts < ActiveRecord::Migration 
      def change 
        add_column :products, :part_number, :string
      end 
    end

    删除列
       rails generate migration RemovePartNumberToProduct part_number:string

    class RemovePartNumberFromProducts < ActiveRecord::Migration 
      def up 
        remove_column :products, :part_number 
      end 
         
      def down 
        add_column :products, :part_number, :string
      end 
    end

    还可以添加多个列

    rails generate migration AddDetailsToProducts part_number:string price:decimal
         
         
    class AddDetailsToProducts < ActiveRecord::Migration 
      def change 
        add_column :products, :part_number, :string
        add_column :products, :price, :decimal
      end 
    end

    3.编写mirgation

    3.1.创建表

    create_table :products do |t| 
         
      t.string :name 
         
    end 
         
    create_table :products do |t| 
         
      t.column :name, :string, :null => false
         
    end

    如果数据库是mysql,还可以通过下面的语句指定使用的引擎,mysql默认的引擎是InnoDB。

    create_table :products, :options => "ENGINE=MyISAM" do |t| 
      t.string :name, :null => false
    end

    3.2.修改表结构

    change_table :products do |t| 
      t.remove :description, :name 
      t.string :part_number 
      t.index :part_number 
      t.rename :upccode, :upc_code 
    end

    删除name,description字段,添加part_number字段,在part_number字段建立索引,重命名upccode为upc_code。

    3.3.辅助工具

    t.timestamps可以自动添加created_at 和 updated_at列。

    #创建表的同时添加 
    create_table :products do |t| 
      t.timestamps 
    end 
         
    #给已经存在的表添加 
    change_table :products do |t| 
      t.timestamps 
    end

    还有一个帮助工具references,用来指明表的外键关系。

    create_table :products do |t| 
      t.references :category 
    end

    上面的代码会在products表中添加一个外键字段category_id。

    create_table :products do |t| 
      t.references :attachment, :polymorphic => {:default => 'Photo'} 
    end

    上面的代码不仅会在products表中添加外键字段attachment_id,还会添加attachment_type字段,string类型,默认值是Photo。

  • 相关阅读:
    Java: Chain of Responsibility Pattern
    CSharp: Chain of Responsibility Pattern
    CSharp: Command Pattern
    CSharp: Proxy Pattern
    CSharp:Flyweight Patterns
    Java: Command Pattern
    C++工厂模式
    C++实现私有化PIMPL[Private Implementation]
    Qt:Using QByteRef with an index pointing outside the valid range of a QByteArray
    std::stack
  • 原文地址:https://www.cnblogs.com/zqn518/p/4113208.html
Copyright © 2020-2023  润新知