- 浏览: 1776798 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
写道
标题: 使用Rails 数据库DSL与PHP协作开发
作者: 色色
博客: http://vb2005xu.iteye.com
日期: 2009年10月27日
十一了解了rails,特别喜欢上了其中的rake db:migrate 指令,我并不是Rails程序员,而是PHP程序员.
在之后的项目中,我使用了Rails的数据库DSL来构建和管理项目中的MYSQL数据库,以下简要的描述些语法.
1. 了解RAILS DB DSL定义的数据类型与MYSQL数据库的数据类型是最重要的
Rails Migration Symbol | MySQL Data Type
:binary blob
:boolean tinyint(1)
:date date
:datetime datetime
:decimal decimal
:float float
:integer int(11)
:string varchar(255)
:text text
:time time
:timestamp datetime
2. 熟悉rails常用命令,关于RAILS环境搭建,见我上篇文章.
1. rails sdo_todo 生成一个项目
2. 在生成的文件夹sdo_todo下建立一个批处理文件open-console.bat,内容为:
cmd
此文件用于方便之后使用终端命令时可以自动切入到此目录下
修改其下的config\database.yml文件,里面换成你的数据库的链接属性
3. 运行open-console.bat文件,在打开的DOS提示符中输入
ruby script\generate migration CreateCategories
来创建分类数据表骨架代码,它将会在db\migrate\20091022065038_create_categories.rb文件,
文件名最前面的是此文件的创建时间戳,用于数据库迁移的,暂时不用管它,知道就行
4. 编辑 20091022065038_create_categories.rb 文件,内容如下所示:
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :categories do |t|
# 父分类 id
t.column :parent_id, :integer, :limit => 11, :null => false
# 分类名称
t.column :name, :string, :limit => 64, :null => false
# 显示顺序
t.column :displayorder, :integer, :limit => 3, :null => false, :default => 0
t.column :left_value, :integer, :limit => 11, :null => false
t.column :right_value, :integer, :limit => 11, :null => false
t.timestamps
end
end
def self.down
drop_table :categories
end
end
此处,它会自动为创建的表加上主键id,如果你不需要主键,可以在这出代码加上
create_table :categories , :id => false do |t|
如果你想自定义主键名称,则可以这样写:
create_table :categories , :primary_key => 'role_id' do |t|
5. 运行rake db:migrate命令,将会在指定的数据库中自动生成两个表:
categories , schema_migrations[用于数据库迁移的,暂时不用管它]
6. 注意的地方,由于windows系统的缺省字符集的问题,如果数据库表构建文件中包含中文字符,
必须使用系统缺省的Ascii字符编码 ,就像上面的20091022065038_create_categories.rb文件,
必须使用Ascii字符编码.
3. 上面讲述了对单表的操作,这里再讲述下对多表以及外键的添加,此处给出基本RBAC功能的表结构实例:
1. ruby script\generate migration CreateUsers
20091022051819_create_users.rb
class CreateUsers < ActiveRecord::Migration
def self.up
#用户表
create_table :users ,:primary_key => 'user_id' do |t|
#名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#密码
t.column :password, :string, :limit => 80, :null => false
#邮件
t.column :email, :string, :limit => 255
t.timestamps
end
end
def self.down
drop_table :users
end
end
2. ruby script\generate migration CreateRolesAndUsersRoles
20091022052732_create_roles_and_users_roles.rb
class CreateRolesAndUsersRoles < ActiveRecord::Migration
def self.up
#角色表-- 角色类似Windwos系统中的用户组
create_table :roles,:primary_key => 'role_id' do |t|
#角色名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#角色描述
t.column :description, :string, :limit => 255
t.timestamps
end
# 用户角色关联表 -- 多对多的关系
create_table :users_roles, :id=>false do |t|
t.column :user_id, :integer, :null => false
t.column :role_id , :integer, :null => false
end
say_with_time '添加外键' do
# 给users_roles 添加外键
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_roles FOREIGN KEY(role_id) REFERENCES roles(role_id) ON DELETE CASCADE'
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_users FOREIGN KEY(user_id) REFERENCES users(user_id) ON DELETE CASCADE'
end
say_with_time '添加缺省角色和用户,并分配缺省组' do
execute(" INSERT INTO users values (1,'sese','$1$QZ4.ZF/.$9YDUbdcLkk.ldvEFNPbZg1','vb2005xu@qq.com','2009-10-22 16:23:47',0) ")
execute(" insert into roles values(1,'SYSTEM_ADMIN',NULL,'2009-10-22 16:23:47',0)")
execute(" insert into users_roles values(1 , 1) ")
end
end
def self.down
drop_table :users_roles
drop_table :roles
end
end
4. Rails DB DSL的局限性也有,从上例可以看到:
1. 添加外键时,得手动写SQL,这就不能实现跨数据库的操作,因为每种数据库的SQL都有些区别
2. 似乎不支持存储过程的创建
之上是我最近使用Rails的经验,刚接触不到一个月的时间,肯定有很多问题,请高手们指正,谢谢
作者: 色色
博客: http://vb2005xu.iteye.com
日期: 2009年10月27日
十一了解了rails,特别喜欢上了其中的rake db:migrate 指令,我并不是Rails程序员,而是PHP程序员.
在之后的项目中,我使用了Rails的数据库DSL来构建和管理项目中的MYSQL数据库,以下简要的描述些语法.
1. 了解RAILS DB DSL定义的数据类型与MYSQL数据库的数据类型是最重要的
Rails Migration Symbol | MySQL Data Type
:binary blob
:boolean tinyint(1)
:date date
:datetime datetime
:decimal decimal
:float float
:integer int(11)
:string varchar(255)
:text text
:time time
:timestamp datetime
2. 熟悉rails常用命令,关于RAILS环境搭建,见我上篇文章.
1. rails sdo_todo 生成一个项目
2. 在生成的文件夹sdo_todo下建立一个批处理文件open-console.bat,内容为:
cmd
此文件用于方便之后使用终端命令时可以自动切入到此目录下
修改其下的config\database.yml文件,里面换成你的数据库的链接属性
3. 运行open-console.bat文件,在打开的DOS提示符中输入
ruby script\generate migration CreateCategories
来创建分类数据表骨架代码,它将会在db\migrate\20091022065038_create_categories.rb文件,
文件名最前面的是此文件的创建时间戳,用于数据库迁移的,暂时不用管它,知道就行
4. 编辑 20091022065038_create_categories.rb 文件,内容如下所示:
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :categories do |t|
# 父分类 id
t.column :parent_id, :integer, :limit => 11, :null => false
# 分类名称
t.column :name, :string, :limit => 64, :null => false
# 显示顺序
t.column :displayorder, :integer, :limit => 3, :null => false, :default => 0
t.column :left_value, :integer, :limit => 11, :null => false
t.column :right_value, :integer, :limit => 11, :null => false
t.timestamps
end
end
def self.down
drop_table :categories
end
end
此处,它会自动为创建的表加上主键id,如果你不需要主键,可以在这出代码加上
create_table :categories , :id => false do |t|
如果你想自定义主键名称,则可以这样写:
create_table :categories , :primary_key => 'role_id' do |t|
5. 运行rake db:migrate命令,将会在指定的数据库中自动生成两个表:
categories , schema_migrations[用于数据库迁移的,暂时不用管它]
6. 注意的地方,由于windows系统的缺省字符集的问题,如果数据库表构建文件中包含中文字符,
必须使用系统缺省的Ascii字符编码 ,就像上面的20091022065038_create_categories.rb文件,
必须使用Ascii字符编码.
3. 上面讲述了对单表的操作,这里再讲述下对多表以及外键的添加,此处给出基本RBAC功能的表结构实例:
1. ruby script\generate migration CreateUsers
20091022051819_create_users.rb
class CreateUsers < ActiveRecord::Migration
def self.up
#用户表
create_table :users ,:primary_key => 'user_id' do |t|
#名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#密码
t.column :password, :string, :limit => 80, :null => false
#邮件
t.column :email, :string, :limit => 255
t.timestamps
end
end
def self.down
drop_table :users
end
end
2. ruby script\generate migration CreateRolesAndUsersRoles
20091022052732_create_roles_and_users_roles.rb
class CreateRolesAndUsersRoles < ActiveRecord::Migration
def self.up
#角色表-- 角色类似Windwos系统中的用户组
create_table :roles,:primary_key => 'role_id' do |t|
#角色名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#角色描述
t.column :description, :string, :limit => 255
t.timestamps
end
# 用户角色关联表 -- 多对多的关系
create_table :users_roles, :id=>false do |t|
t.column :user_id, :integer, :null => false
t.column :role_id , :integer, :null => false
end
say_with_time '添加外键' do
# 给users_roles 添加外键
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_roles FOREIGN KEY(role_id) REFERENCES roles(role_id) ON DELETE CASCADE'
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_users FOREIGN KEY(user_id) REFERENCES users(user_id) ON DELETE CASCADE'
end
say_with_time '添加缺省角色和用户,并分配缺省组' do
execute(" INSERT INTO users values (1,'sese','$1$QZ4.ZF/.$9YDUbdcLkk.ldvEFNPbZg1','vb2005xu@qq.com','2009-10-22 16:23:47',0) ")
execute(" insert into roles values(1,'SYSTEM_ADMIN',NULL,'2009-10-22 16:23:47',0)")
execute(" insert into users_roles values(1 , 1) ")
end
end
def self.down
drop_table :users_roles
drop_table :roles
end
end
4. Rails DB DSL的局限性也有,从上例可以看到:
1. 添加外键时,得手动写SQL,这就不能实现跨数据库的操作,因为每种数据库的SQL都有些区别
2. 似乎不支持存储过程的创建
之上是我最近使用Rails的经验,刚接触不到一个月的时间,肯定有很多问题,请高手们指正,谢谢
- 使用Rails_数据库DSL与PHP协作开发_-_色色.pdf (97.9 KB)
- 下载次数: 7
- ruby-np__编辑器API.rar (9.9 KB)
- 下载次数: 1
评论
3 楼
vb2005xu
2009-12-28
class CreateCitysImpressions < ActiveRecord::Migration def self.up create_table :citys_impressions do |t| t.column :city_id, :integer, :null => false t.column :option, :string, :limit => 255, :null => false t.column :value, :integer, :default => 0 t.timestamps end say_with_time 'add FOREIGN KEY city_impressions(city_id)' do execute 'ALTER TABLE citys_impressions ADD CONSTRAINT fk_tb_cimpres FOREIGN KEY(city_id) REFERENCES citys(id) ON DELETE CASCADE' end end def self.down say_with_time 'drop FOREIGN KEY citys_purposes' do # first drop FOREIGN KEY execute 'alter table citys_impressions drop foreign key fk_tb_cimpres' end drop_table :city_impressions end end
2 楼
vb2005xu
2009-10-28
自动生成的SQL如下所示
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for articlemetas -- ---------------------------- CREATE TABLE `articlemetas` ( `id` int(11) NOT NULL auto_increment, `title` varchar(120) collate utf8_unicode_ci default NULL, `description` varchar(255) collate utf8_unicode_ci default NULL, `keywords` varchar(255) collate utf8_unicode_ci default NULL, `created_at` datetime default NULL, `updated_at` datetime default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for articles -- ---------------------------- CREATE TABLE `articles` ( `id` int(11) NOT NULL auto_increment, `subject` varchar(255) collate utf8_unicode_ci NOT NULL, `summarize` varchar(1255) collate utf8_unicode_ci default NULL, `body` text collate utf8_unicode_ci, `visible` tinyint(1) NOT NULL default '1', `created_at` datetime default NULL, `updated_at` datetime default NULL, `articlemeta_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `fk_tb_articlemetas` (`articlemeta_id`), CONSTRAINT `fk_tb_articlemetas` FOREIGN KEY (`articlemeta_id`) REFERENCES `articlemetas` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for articles_categories -- ---------------------------- CREATE TABLE `articles_categories` ( `article_id` int(11) NOT NULL, `categorie_id` int(11) NOT NULL, KEY `fk_tb_articles` (`article_id`), KEY `fk_tb_categories` (`categorie_id`), CONSTRAINT `fk_tb_categories` FOREIGN KEY (`categorie_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_tb_articles` FOREIGN KEY (`article_id`) REFERENCES `articles` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for categories -- ---------------------------- CREATE TABLE `categories` ( `id` int(11) NOT NULL auto_increment, `parent_id` int(11) NOT NULL, `name` varchar(64) collate utf8_unicode_ci NOT NULL, `displayorder` mediumint(9) NOT NULL default '0', `left_value` int(11) NOT NULL, `right_value` int(11) NOT NULL, `created_at` datetime default NULL, `updated_at` datetime default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for develop_logs -- ---------------------------- CREATE TABLE `develop_logs` ( `id` int(11) NOT NULL auto_increment, `content` text collate utf8_unicode_ci, `created_at` datetime default NULL, `updated_at` datetime default NULL, `level` varchar(40) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for roles -- ---------------------------- CREATE TABLE `roles` ( `role_id` int(11) NOT NULL auto_increment, `name` varchar(80) collate utf8_unicode_ci NOT NULL, `description` varchar(255) collate utf8_unicode_ci default NULL, `created_at` datetime default NULL, `updated_at` datetime default NULL, PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for schema_migrations -- ---------------------------- CREATE TABLE `schema_migrations` ( `version` varchar(255) collate utf8_unicode_ci NOT NULL, UNIQUE KEY `unique_schema_migrations` (`version`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for users -- ---------------------------- CREATE TABLE `users` ( `user_id` int(11) NOT NULL auto_increment, `name` varchar(80) collate utf8_unicode_ci NOT NULL, `password` varchar(80) collate utf8_unicode_ci NOT NULL, `email` varchar(255) collate utf8_unicode_ci default NULL, `created_at` datetime default NULL, `updated_at` datetime default NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Table structure for users_roles -- ---------------------------- CREATE TABLE `users_roles` ( `user_id` int(11) NOT NULL, `role_id` int(11) NOT NULL, KEY `fk_tb_roles` (`role_id`), KEY `fk_tb_users` (`user_id`), CONSTRAINT `fk_tb_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE, CONSTRAINT `fk_tb_roles` FOREIGN KEY (`role_id`) REFERENCES `roles` (`role_id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records -- ---------------------------- INSERT INTO `roles` VALUES ('1', 'SYSTEM_ADMIN', null, '2009-10-22 16:23:47', '0000-00-00 00:00:00'); INSERT INTO `schema_migrations` VALUES ('20091022051819'); INSERT INTO `schema_migrations` VALUES ('20091022052732'); INSERT INTO `schema_migrations` VALUES ('20091022065038'); INSERT INTO `schema_migrations` VALUES ('20091027025734'); INSERT INTO `schema_migrations` VALUES ('20091027031454'); INSERT INTO `schema_migrations` VALUES ('20091027083804'); INSERT INTO `schema_migrations` VALUES ('20091028041728'); INSERT INTO `users` VALUES ('1', 'admin', '$1$QZ4.ZF/..ldvEFNPbZg1', '', '2009-10-22 16:23:47', '0000-00-00 00:00:00'); INSERT INTO `users_roles` VALUES ('1', '1');
1 楼
vb2005xu
2009-10-28
再贴一个完整的例子
class CreateArticles < ActiveRecord::Migration def self.up create_table :articles do |t| t.column :subject, :string, :limit => 255, :null => false t.column :summarize, :string, :limit => 1255 t.column :body, :text t.column :visible, :boolean, :null => false, :default => 1 t.timestamps end # add column articlemeta_id to store the articlemeta [title*description*keywords] add_column(:articles, :articlemeta_id, :integer, :null => false, :unique => true) say_with_time 'add FOREIGN KEY articles(articlemeta_id)' do execute 'ALTER TABLE articles ADD CONSTRAINT fk_tb_articlemetas FOREIGN KEY(articlemeta_id) REFERENCES articlemetas(id) ON DELETE CASCADE' end # create table articles_categories to store article categorie create_table :articles_categories, :id=>false do |t| t.column :article_id, :integer, :null => false t.column :categorie_id , :integer, :null => false end say_with_time 'add FOREIGN KEY articles_categories(article_id,categorie_id)' do execute 'ALTER TABLE articles_categories ADD CONSTRAINT fk_tb_articles FOREIGN KEY(article_id) REFERENCES articles(id) ON DELETE CASCADE' execute 'ALTER TABLE articles_categories ADD CONSTRAINT fk_tb_categories FOREIGN KEY(categorie_id) REFERENCES categories(id) ON DELETE CASCADE' end end def self.down drop_table :articles_categories say_with_time 'drop FOREIGN KEY articles(articlemeta_id)' do # first drop FOREIGN KEY execute 'alter table articles drop foreign key fk_tb_articlemetas' end remove_column(:articles,:articlemeta_id) drop_table :articles end end
相关推荐
标题 "rails-documentation-1-2-1.zip" 暗示这是一份关于 Ruby on Rails 框架的文档,版本为 1.2.1。Ruby 是一种面向对象的编程语言,而 Rails 是一个基于 Ruby 的开源 Web 应用程序框架,遵循 Model-View-...
`rails-documentation-2-0-2.chm` 文件详细涵盖了这些概念,包含了关于Rails 2.0.2的API参考、教程和指南。通过仔细阅读和实践,开发者能够深入理解Rails的工作原理,并有效地开发出高效、可维护的Web应用。
标题中的“Web开发敏捷之道--应用Rails进行敏捷Web开发 之 Depot代码”表明这是一个关于使用Ruby on Rails框架进行敏捷Web开发的示例项目,名为Depot。Ruby on Rails(简称Rails)是一个开源的Web应用程序框架,它...
《Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版》是针对现代Web开发的一本经典教程,专注于使用Ruby on Rails框架实现敏捷开发方法。这本书的中文版为中国的开发者提供了便利,使他们能够更好地理解和应用这个...
《Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版》是一本专注于使用Ruby on Rails框架进行高效敏捷开发的专业书籍。在当前快速迭代、需求多变的互联网环境中,敏捷开发方法论已经成为了软件开发行业的主流实践。...
在Ruby on Rails框架中,数据库配置是至关重要的部分,它允许开发者与各种数据库系统...理解这个过程对于开发基于Rails的应用程序至关重要,因为这使得Rails能够与各种数据库系统无缝协作,实现数据存储和检索功能。
Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rarWeb开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rarWeb开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rarWeb开发敏捷之道-应用Rails进行敏捷Web开发-第三版...
**示例**: 创建一个名为 `blog` 的 Rails 应用程序,并使用 PostgreSQL 数据库。 ``` rails new blog -d postgresql ``` #### 三、Rails API 文档服务器 **命令**: `gem server` - **功能**: 启动一个 WEBrick ...
[Ruby_on_Rails][資料庫]_04.__後台快速開發_-_Rails_Admin_安裝
总的来说,SecondBase是Rails开发中的一个重要工具,它为多数据库环境下的应用提供了便利,简化了开发流程,提高了代码的可维护性和项目的扩展性。如果你的Rails应用需要处理复杂的数据分布,那么SecondBase是一个...
在本文中,我们将深入探讨如何使用Rails敏捷开发技术构建一个购物车系统,特别是在参考《rails敏捷开发第四版》中的示例。Rails 3.2.6是本文的基础框架,它是一个强大的Ruby Web应用程序框架,以其MVC(模型-视图-...
Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...
Rails数据库方案 Rails数据库模式的Autocomplete +提供程序。 特征 自动完成活动记录 根据当前上下文打开模式文件 设定值 ... ' ctrl-r s ' : ' rails-db-scheme:open-scheme ' 去做 多文件夹项目