- 浏览: 274252 次
- 性别:
- 来自: 尤溪
文章分类
最新评论
-
palytoxin:
我现在也发现是这样
关于分享 -
float2net:
Java社区,分享有利于提高。
关于分享 -
hz_qiuyuanxin:
头晕啊,啊邱
RSpec学习笔记 -
reyesyang:
...
关于分享 -
Hooopo:
一般实现map都先实现each
在 Ruby 中对树状结构(tree)进行 map 操作
参考资料:http://guides.rubyonrails.org/migrations.html
一、Migrations:
1、名字:
文件名就是个普通的ruby文件名前面加上时间戳,类名的命名规则跟普通的ruby类没什么两样,只是要把前面的时间戳去掉,比如文件名为20080906120001_add_details_to_products.rb的migration类名应该是AddDetailsToProducts。
rails只把时间戳部分作为识别migration的id,所有执行过的migration的id都将被保存到数据库的schema_migrations表中。在rails2.1之前的版本中,migration的id是从1开始增长,但是,很容易想到,在多人合作开发项目的时候,这样会很有问题。
当然,在新版本的rails中也可以通过在environment.rb设置config.active_record.timestamped_migrations的值为false来使用旧的方式生成migration的id。
(还是直接copy起来爽快……)
2、修改migrations
如果写错了一个migration并且运行过,别直接修改它然后再次rake db:migrate,因为rails并不知道你修改了migration,执行rake db:migrate时rails并不会做任何事。正确的做法是,先rake db:migrate:down或者rake db:rollback,然后再编辑这个migration,最后再次rake db:migrate。
一般来说最好不要去编辑一个已经存在了的migration,即便里面有错误。
最好的做法是写一个新的migration来执行修复上一个写错了的migration的操作。
3、创建migrations
generate model和generate scaffold命令都会创建一个migration,用于生成model对应的数据库结构。如果想要执行其它的修改数据库结构的操作——比如说给某个表添加一个字段,可以用generate migration来手动创建一个migration。这3种创建migration的命令的格式都一样:
如果migration_name的名字格式是像“add_xxx_to_xxx”或者“remove_xxx_from_xxx”这样的(经试验,也可以用驼峰命名法,像这样:AddXXXToXXX),并且后面跟着字段名和类型列表,那么rails将自动把add_column和remove_column指令加到生成的migration代码当中。例如:
将会生成:
这样的ruby代码。
4、writing a migration
建表
以上代码将会创建一个名为products的表,其中包含一个名为name的字符类型字段。还有一种建表的方式是用bloc参数t的column方法,像这样:
create_table方法默认会创建一个名为id的整型自增长字段作为主键(google了一下,要使用uuid作为主键可参考:http://iceskysl.1sters.com/?p=349)。如果不想使用默认的id作为主键名称,可以使用:primary_key来指定某一个字段为主键。如果要创建一个不带主键的表(比如说一个多对多关联的“中间表”就不需要主键),可以传递一个hash :id=>false给create_table方法。
修改表结构
以上代码修改了products表结构,删除了其中的description和name字段,添加了一个字符类型的part_number字段,并且给part_number字段添加索引,最后把upccode字段改名为upc_code。上面的代码完成的事和以下代码是一样的:
4、运行Migration
运行 db:migrate的时候,同时会调用 db:schema:dump这个任务,这个任务是用来更新db/schema.rb文件,使之与你的数据库结构匹配。
db:migrate:up和db:migrate:down都需要一个VERSION参数,用来指定目标版本,版本号就是migration的id,也就是那个时间戳。前者调用migration中的up方法,后者调用down方法。
db:migrate也可以设置VERSION参数,如果指定版本低于当前版本,所有在当前版本号跟指定版本号之间的migration(包括当前版本但不包括目标版本)的down方法将会被按版本号降序调用。如果指定版本号高于当前版本号,则所有在当前版本号跟指定版本号之间的migration(不包括当前版本但包括目标版本)的up方法将会被按版本号升序调用。
与db:migrate:up和db:migrate:down所不同的是,db:migrate经常是批量的执行N个migration的up或down方法,而db:migrate:up和db:migrate:down只能执行一个(指定的那个)migration的up或者down方法。
还有两种批量执行migrate任务的方法是db:rollback和db:migrate:redo,这两个任务都需要一个参数STEP,用于指定执行的步数。rollback懒得写了,看字面意思就很明白:rake db:rollback STEP=3。db:migrate:redo STEP=3将会从当前版本开始,往回执行最后3个版本的migration的down方法,也就是说前面这一步跟rollback STEP=3一样,然后再回来按升序执行migration的up方法。唉,表达能力好差,原文是这样的:
最后,db:reset 任务将会卸载整个数据库,接着通过运行db/schema.rb重新创建整个数据库。关于这个schema.rb,看看它源代码内的注释(里边还提到一个db:schema:load):
===2009 09 14===
刚看到个论坛里的帖子,写得比我早,做个链接过去:http://www.iteye.com/topic/423860
实例:
一、Migrations:
1、名字:
文件名就是个普通的ruby文件名前面加上时间戳,类名的命名规则跟普通的ruby类没什么两样,只是要把前面的时间戳去掉,比如文件名为20080906120001_add_details_to_products.rb的migration类名应该是AddDetailsToProducts。
rails只把时间戳部分作为识别migration的id,所有执行过的migration的id都将被保存到数据库的schema_migrations表中。在rails2.1之前的版本中,migration的id是从1开始增长,但是,很容易想到,在多人合作开发项目的时候,这样会很有问题。
当然,在新版本的rails中也可以通过在environment.rb设置config.active_record.timestamped_migrations的值为false来使用旧的方式生成migration的id。
(还是直接copy起来爽快……)
引用
The combination of timestamps and recording which migrations have been run allows Rails to handle common situations that occur with multiple developers.
For example Alice adds migrations 20080906120000 and 20080906123000 and Bob adds 20080906124500 and runs it. Alice finishes her changes and checks in her migrations and Bob pulls down the latest changes. Rails knows that it has not run Alice’s two migrations so rake db:migrate would run them (even though Bob’s migration with a later timestamp has been run), and similarly migrating down would not run their down methods.
For example Alice adds migrations 20080906120000 and 20080906123000 and Bob adds 20080906124500 and runs it. Alice finishes her changes and checks in her migrations and Bob pulls down the latest changes. Rails knows that it has not run Alice’s two migrations so rake db:migrate would run them (even though Bob’s migration with a later timestamp has been run), and similarly migrating down would not run their down methods.
2、修改migrations
如果写错了一个migration并且运行过,别直接修改它然后再次rake db:migrate,因为rails并不知道你修改了migration,执行rake db:migrate时rails并不会做任何事。正确的做法是,先rake db:migrate:down或者rake db:rollback,然后再编辑这个migration,最后再次rake db:migrate。
一般来说最好不要去编辑一个已经存在了的migration,即便里面有错误。
引用
you will be creating extra work for yourself and your co-workers and cause major headaches if the existing version of the migration has already been run on production machines.
最好的做法是写一个新的migration来执行修复上一个写错了的migration的操作。
引用
Editing a freshly generated migration that has not yet been committed to source control (or more generally which has not been propagated beyond your development machine) is relatively harmless. Just use some common sense.
3、创建migrations
generate model和generate scaffold命令都会创建一个migration,用于生成model对应的数据库结构。如果想要执行其它的修改数据库结构的操作——比如说给某个表添加一个字段,可以用generate migration来手动创建一个migration。这3种创建migration的命令的格式都一样:
ruby script/generate scaffold|model|migration migration_name column_name:column_type ...
如果migration_name的名字格式是像“add_xxx_to_xxx”或者“remove_xxx_from_xxx”这样的(经试验,也可以用驼峰命名法,像这样:AddXXXToXXX),并且后面跟着字段名和类型列表,那么rails将自动把add_column和remove_column指令加到生成的migration代码当中。例如:
ruby script/generate migration add_part_number_to_products part_number:string
将会生成:
class AddPartNumberToProducts < ActiveRecord::Migration def self.up add_column :products, :part_number, :string end def self.down remove_column :products, :part_number end end
这样的ruby代码。
4、writing a migration
建表
create_table :products do |t| t.string :name end
以上代码将会创建一个名为products的表,其中包含一个名为name的字符类型字段。还有一种建表的方式是用bloc参数t的column方法,像这样:
create_table :products do |t| t.column :name, :string end
引用
the first form(原文是second,我把代码的顺序调换了一下), the so called “sexy” migration, drops the somewhat redundant column method. Instead, the string, integer, etc. methods create a column of that type. Subsequent parameters are the same.
create_table方法默认会创建一个名为id的整型自增长字段作为主键(google了一下,要使用uuid作为主键可参考:http://iceskysl.1sters.com/?p=349)。如果不想使用默认的id作为主键名称,可以使用:primary_key来指定某一个字段为主键。如果要创建一个不带主键的表(比如说一个多对多关联的“中间表”就不需要主键),可以传递一个hash :id=>false给create_table方法。
引用
The types supported by Active Record are :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.
修改表结构
change_table :products do |t| t.remove :description, :name t.string :part_number t.index :part_number t.rename :upccode, :upc_code end
以上代码修改了products表结构,删除了其中的description和name字段,添加了一个字符类型的part_number字段,并且给part_number字段添加索引,最后把upccode字段改名为upc_code。上面的代码完成的事和以下代码是一样的:
remove_column :products, :description remove_column :products, :name add_column :products, :part_number, :string add_index :products, :part_number rename_column :products, :upccode, :upc_code
引用
You don’t have to keep repeating the table name and it groups all the statements related to modifying one particular table. The individual transformation names are also shorter, for example remove_column becomes just remove and add_index becomes just index.
4、运行Migration
运行 db:migrate的时候,同时会调用 db:schema:dump这个任务,这个任务是用来更新db/schema.rb文件,使之与你的数据库结构匹配。
db:migrate:up和db:migrate:down都需要一个VERSION参数,用来指定目标版本,版本号就是migration的id,也就是那个时间戳。前者调用migration中的up方法,后者调用down方法。
db:migrate也可以设置VERSION参数,如果指定版本低于当前版本,所有在当前版本号跟指定版本号之间的migration(包括当前版本但不包括目标版本)的down方法将会被按版本号降序调用。如果指定版本号高于当前版本号,则所有在当前版本号跟指定版本号之间的migration(不包括当前版本但包括目标版本)的up方法将会被按版本号升序调用。
与db:migrate:up和db:migrate:down所不同的是,db:migrate经常是批量的执行N个migration的up或down方法,而db:migrate:up和db:migrate:down只能执行一个(指定的那个)migration的up或者down方法。
还有两种批量执行migrate任务的方法是db:rollback和db:migrate:redo,这两个任务都需要一个参数STEP,用于指定执行的步数。rollback懒得写了,看字面意思就很明白:rake db:rollback STEP=3。db:migrate:redo STEP=3将会从当前版本开始,往回执行最后3个版本的migration的down方法,也就是说前面这一步跟rollback STEP=3一样,然后再回来按升序执行migration的up方法。唉,表达能力好差,原文是这样的:
引用
The db:migrate:redo task is a shortcut for doing a rollback and then migrating back up again.
最后,db:reset 任务将会卸载整个数据库,接着通过运行db/schema.rb重新创建整个数据库。关于这个schema.rb,看看它源代码内的注释(里边还提到一个db:schema:load):
引用
# This file is auto-generated from the current state of the database. Instead of editing this file, # please use the migrations feature of Active Record to incrementally modify your database, and # then regenerate this schema definition. # # Note that this schema.rb definition is the authoritative source for your database schema. If you need # to create the application database on another system, you should be using db:schema:load, not running # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # # It's strongly recommended to check this file into your version control system.
引用
Schema files are also useful if you want a quick look at what attributes an Active Record object has. This information is not in the model’s code and is frequently spread across several migrations but is all summed up in the schema file. The annotate_models plugin, which automatically adds (and updates) comments at the top of each model summarising the schema, may also be of interest.
There are two ways to dump the schema. This is set in config/environment.rb by the config.active_record.schema_format setting, which may be either :sql or :ruby.
If :ruby is selected then the schema is stored in db/schema.rb.
There are two ways to dump the schema. This is set in config/environment.rb by the config.active_record.schema_format setting, which may be either :sql or :ruby.
If :ruby is selected then the schema is stored in db/schema.rb.
===2009 09 14===
刚看到个论坛里的帖子,写得比我早,做个链接过去:http://www.iteye.com/topic/423860
评论
2 楼
sinopf
2011-03-26
文章不错,没注意英文,看了你这篇文章才清楚一些
1 楼
yuan
2009-10-16
《Agile Web Development With Rails》 写道
数据迁移有一个严重的问题:它用于更新数据库结构的DDL语句不是事务性的。这并不是Rails的错:大部分数据库根本不支持create table、alter table和其他一些DDL语句的回滚。
实例:
引用
是这样的,我已经有了一个Model叫Book,Book有一属性title:string。
然后我忘了我之前给Book加了这么个属性,现在我想给Book添加一些属性:
完了接着就是rake db:migrate
结果发现字段重复了:Mysql::Error: Duplicate column name 'title': ALTER TABLE `books` ADD `title` varchar(255)
按道理这时候应该没有修改任何数据库结构,但是事实是:它改了。books表被添加了一个author字段,但schema_migrations里却没有记录最后执行的那个migration。
然后我忘了我之前给Book加了这么个属性,现在我想给Book添加一些属性:
ruby script/generate migration add_author_and_title_to_books author:string title:string
完了接着就是rake db:migrate
结果发现字段重复了:Mysql::Error: Duplicate column name 'title': ALTER TABLE `books` ADD `title` varchar(255)
按道理这时候应该没有修改任何数据库结构,但是事实是:它改了。books表被添加了一个author字段,但schema_migrations里却没有记录最后执行的那个migration。
发表评论
-
rails测试中遇到的一些问题
2010-09-03 11:41 25161,页面的测试。 假设某view中有一个表单,表单里有3个字段 ... -
BDD on Rails
2010-05-11 02:59 0首先,嘿嘿,我对敏捷 ... -
强大的 Rails 2 查询、搜索插件:SearchLogic
2010-04-20 23:31 5427发现还有人在看这个博客,这个 SearchLogic 只支持 ... -
authlogic-openid
2010-04-20 00:32 0http://github.com/binarylogic/a ... -
测试驱动开发实战(authlogic学习笔记)
2010-04-17 00:06 0这会是个很cool的笔记 cucumber还不会用,只用R ... -
RoR简单培训。
2010-04-12 10:08 0目的 上周二Bob给大家从总体上概括了一下Rails的开发。我 ... -
用RSpec和Webrat为页面写测试
2010-03-10 23:26 0The RSpec Book 23章(不完全照书上记,而是我自 ... -
rails杂记
2010-03-08 11:36 1429=======Rails2======= 用RSpec测试A ... -
Rails文件上传利器——paperclip笔记
2010-02-27 12:04 14931Githubhttp://wiki.github.com/th ... -
为SearchLogic添加一个remote_form_for方法。
2010-02-10 15:00 1381稍微看了一下,好像挺简单,只是处理了一下参数。 # A ... -
A Guide to Testing Rails Applications
2010-02-03 19:56 0什么是Fixtures fixtures允许你在测试运行之前往 ... -
改个bug
2010-01-20 17:38 1209问题见:http://yuan.iteye.c ... -
reset/reload
2010-01-20 16:26 1126http://caboo.se/doc/classes/Act ... -
Acts As Taggable On Steroids
2010-01-20 13:53 2597参考着mephisto写blog程序 ... -
Active Record Validations and Callbacks
2009-10-18 02:45 2364参考链接:http://guides.ru ... -
Layout in Rails
2009-10-12 17:28 4731参考链接:http://guides.rubyonrails. ... -
Rendering in Rails
2009-10-10 02:10 4515参考链接:http://guides.rubyonrails. ... -
如何为Rails的views写测试。
2009-10-01 16:53 1108原文链接:http://weblog.jamisbuck.or ... -
Rails Form helpers
2009-09-28 03:31 5162参考链接:http://guides.ru ... -
rails2.3 routes笔记
2009-09-23 04:10 2826参考链接:http://guides.ru ...
相关推荐
rails 2.3 chm文档 官方最新版
Railsbrain是一个专注于Rails框架的在线资源平台,而这个“railsbrain网站的rails2.3文档(bug修复版)”显然是一份针对Rails 2.3版本的更新文档,旨在修复用户在浏览和交互过程中遇到的问题。Rails是Ruby编程语言的...
Ruby on Rails Guide:是rails官方教程,本人为了大家学习查阅的方便,制成chm格式。就如同java doc的chm格式一样方便。
所有必需的信息都可以在Wiki上找到: 如有疑问,请使用i18_routing谷歌论坛: 适用于Rails 2.3、3.0、3.1和3.2下一个版本的TODO(写于2010年6月9日) 处理同一资源名称的多个翻译(例如:嵌套和非嵌套资源) 处理...
Rails是一个基于Ruby语言的开源Web应用程序框架,它遵循模型-视图-控制器(MVC)架构模式,旨在提高开发效率和代码的可读性。 在这个API文档中,你可以找到关于以下关键知识点的详细信息: 1. **Ruby语法基础**:...
Rails 3.2 API 是一个重要的开发资源,主要用于Ruby on Rails框架的开发。Rails是基于Ruby语言的一个开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,广泛应用于构建动态网站和Web应用程序。Rails ...
描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...
Rails 2.3 和 3 兼容。 关于 PgQ 安装 安装天空工具:Ubuntu 11.10: # apt-get install postgresql-server postgresql-client # apt-get install skytools 宝石档案: gem 'pgq' 从 database.yml 创建股票...
rails guides的CHM版本,这个向导的版本是2.3
标题 "rails查询学习笔记" 涉及的是Ruby on Rails框架中的数据库查询技术。Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发Web应用更加高效...
综上所述,Ruby on Rails的笔记内容涵盖了从安装Rails环境到创建和运行一个简单的Rails项目的基础知识,这些内容对于初学者来说是学习Rails框架的极好入门材料。通过对这些知识点的学习,初学者可以快速了解Rails的...
从给定的文件信息来看,这份文档是陈刚关于Ruby on Rails的学习笔记,旨在帮助初学者更好地理解并掌握Ruby on Rails这一流行的Web开发框架。以下是对文档中提及的关键知识点的详细解析: ### 安装与配置 #### Ruby...
### Ruby on Rails 笔记知识点总结 #### 一、引言 在《Ruby on Rails笔记》中,作者陈刚分享了他在学习Ruby on Rails过程中的经验与心得。这份笔记不仅包含了作者的学习历程和个人体会,还汇集了他在学习过程中遇到...
《Ruby on Rails与MySQL环境配置详解》 在开发基于Web的应用程序时,Ruby on Rails(简称Rails)框架和MySQL数据库的结合是常见的选择。本文将详细介绍如何在Windows环境下配置Ruby on Rails以支持Rails 2.3.5及...
rails官网入门笔记的翻译,非常不错的rubyonrails入门教程!
### Web敏捷开发与Rails实践详解 #### 一、Rails简介及环境搭建 Rails是一个用于Web开发的开源框架,它基于Ruby语言,强调简洁性、生产力和开发者效率。Rails通过约定优于配置的原则,使得开发者能够快速地搭建Web...
对于 Rails 2.3 版本,请使用 genspec 0.1.x。 请注意,它不再被积极维护; 只有错误修复才会提交到这个 gem 的 Rails 2.3 版本。 安装 在您的 Gemfile 中... group :test do config . gem 'genspec' end 或者,...