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。
rails之 Migrations (转)的更多相关文章
- rails使用 rake db:migrate 提示 Migrations are pending; run 'rake db:migrate RAILS_ENV=development' to resolve this issue.
首先得特么建立数据库 : rake db:create 实际问题是没有int应该用integer http://www.rubycc.com/column/rails3.2.3/rails.htm
- 脱离rails 使用Active Record
目录结构 database.yml development: adapter: sqlite3 database: db/test.db pool: 5 timeout: 5000 001_schem ...
- rails跑通第一个demo
rails -h 查看帮助 Usage: rails new APP_PATH [options] Options: -r, [--ruby=PATH] # Path to the Ruby bina ...
- Nginx + unicorn 运行多个Rails应用程序
PS:第一次写的很详细,可惜发布失败,然后全没了,这是第二次,表示只贴代码,剩下的自己领悟好了,这就是所谓的一鼓作气再而衰吧,希望没有第三次. 版本: ruby 2.1.0 rails 4.0.2 n ...
- Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception
最近rails3.2在更改数据库表字段,然后要回滚取消,但在运行rake db:rollback命令,错误: rake aborted! An error has occurred, all late ...
- RoR- Database setup& SQLite ... Migrations
*rails uses SQLite for database by default *Built-in command-line DB viewer *Self-contained,server-l ...
- Ruby on Rails Mountable vs. Full Engine
原文 :https://www.travisluong.com/ruby-on-rails-mountable-vs-full-engine/一个Rails Engine 本质是一个 Rails ap ...
- rails学习笔记: rake db 相关命令
rails学习笔记: rake db 命令行 rake db:*****script/generate model task name:string priority:integer script/g ...
- go Rails 知识点,Concepts Series:url和parameter; 建立Rails App Templates;报错页面debug; counter_cache
Rails Concepts Series: https://gorails.com/series/rails-concepts 基本都是免费的 一些细小的知识点,很有帮助. URL和paramete ...
随机推荐
- toStirng()与Object.prototype.toString.call()方法浅谈
一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种类型转化为字符串类型的呢? 通过下面几个例子,我们便能获得答案: 1.将boolean类型的值转 ...
- 简单破解.net(C#)程序
一直在用makedown2(free版),每当打开多个页面,就会提示升级为pro,还要注册码激活什么的.就有了破解的想法.以前也弄过一个小程序的破解,所以还算有些经验. 1. ildasm 用来将ma ...
- Java调用脚本
几个参考: java调用shell http://www.cnblogs.com/Seamanm/archive/2010/10/04/1842059.html java程序中调用linux命令 ...
- quick cocos2dx lua 内存释放
前言 对于内存的优化,网上有很多例子和教程.总体来说,就那么几种解决方案,在最后我会简单提下,这里先说下在quick中,对于图片的处理. 1.查看内存调试信息 对于quick框架的了解,我们可以参考\ ...
- JQ的live(),on(),deletage(),bind()几个的区别
今天在网上看到一篇文章,关于JQ里面事件绑定的区别,说说我自己看后的理解,本人菜鸟一枚,很多东西不懂 ,有理解错误的还望大神们多多指教 bind()方法是绑定事件最直接的方法,这个方法是绑定到docu ...
- [问题2014S12] 解答
[问题2014S12] 解答 先证明一个简单的引理. 引理 设 \(B\) 为 \(n\) 阶半正定 Hermite 阵, \(\alpha\) 为 \(n\) 维复列向量, 若 \(\overl ...
- 通过Mac远程调试iPhone/iPad上的网页(转)
我们知道在 Mac/PC 上的浏览器都有 Web 检查器这类的工具(如最著名的 Firebug)对前端开发进行调试,而在 iPhone/iPad 由于限于屏幕的大小和触摸屏的使用习惯,直接对网页调试非 ...
- 从零开始学iPhone开发(3)——视图及控制器的使用
上一节我们分别使用IB和代码建立了两个视图并且熟悉了一些控件.这一节我们需要了解视图和视图的切换. 在iOS编程中,框架提供了很多视图,比如UIView,UIImageView, UIWebView等 ...
- 无法嵌入互操作类型“ESRI.ArcGIS.Carto.RectangleElementClass”。请改用适用的接口。
右键点击应用的程序集 ESRI.ArcGIS.Controls,修改"嵌入互操作类型"的值即可
- javascript实现json页面分页
下午有个朋友问json 数据怎么分页 就捣鼓了一个东东出来 下面直接代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...