Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
来源:互联网 发布:淘宝装修的图片哪里找 编辑:程序博客网 时间:2024/04/28 10:33
在前文《Ruby on Rails,创建和执行migrations迁移文件》中我们提到过创建模型的事情,我们创建模型的同时生成迁移文件。那时候我们关注的是迁移文件,现在我们把目光投向模型这边。
创建模型的命令是
rails generate model ModelNameInCamelCase
其中最后一个参数是模型的名字,用每个单词首字母大写的格式,比如说rails generate model Subject。
这个操作会生成两个中要的文件,其一是位于db/migrate目录下的迁移文件,“20120901143244_create_subjects.rb”。打开这个文件看看,会发现其实这里面定义的是一个叫做CreateSubjects的类,继承ActiveRecord::Migration,创建一个叫做subjects的表。
class CreateSubjects < ActiveRecord::Migration def change create_table :subjects do |t| t.timestamps end endend
另一个是位于app/model下的subject.rb,注意到是单数。打开文件看一看,其中定义了一个叫做Subject的类,继承ActiveRecord::Base,没有任何其他的内容。这代表着,Subject类打算完全按照ActiveRecord提供的缺省行为运行,这个后面再讲。
注意这些生成文件的位置、文件名、内容可以看出他们之间有着一致性(都基于模型名Subject)。
db/migrate
文件名:20120901143244_create_subjects.rb
类名:CreateSubjects
继承:ActiveRecord::Migration
表名:subjects
app/models
文件名:subject.rb
类名:Subject
继承:ActiveRecord::Base
而如果我们遵守这样的一致性便能保证Rails能够建立他们之间的关系,即使不对这些文件的关系进行更多的配置。比如说在某个时刻我对Rails说:“我要使用Subject类!”。你猜怎么着,Rails就会尝试着到app/models中名为subject.rb文件中找到Subject类的定义。如果我们说:”Subject类,我需要从数据库中读取对象!“。Subject类看了看自己,说没问题,我是一个ActiveRecord所以我知道应该到数据库中找到一张叫subjects的表,并从中读取出相应的对象。
当然了,这种遵守不是必须的,但如果我们简单的遵守规则能够这么方便快捷,有什么理由不这么做呢?
所以说rails generate命令没有什么神秘的,只是帮我们按照约定生成代码而已。我们也可以按照约定自己来编写这些内容,结果不会有任何区别。使用rails generate方法创建出来的模型都自动继承了ActiveRecord,相当于建立了与数据库的关联,如果只想建立一个普通的类并不与数据库关联,删除”<ActiveRecord::Basde“或者手工创建即可。
回过头看一看User类,在app/models目录中,以后模型都在这个目录里放着。这个类创建之后,在《Ruby on Rails,数据库迁移命令和迁移任务编写》中修改过迁移文件。
class AlterUsers < ActiveRecord::Migration def uprename_table("users","admin_users")add_column("admin_users","username",:string,:limit=>25)add_column("admin_users","email",:string,:limit=>50)change_column("admin_users","email",:string,:default=>"",:limit=>100)add_column("admin_users","password",:string,:limit=>25)rename_column("admin_users","password","hashed_password")add_column("admin_users","salt",:string,:limit=>40)puts "***about to add an index ***"add_index("admin_users","username") end def downremove_index("admin_users","username")remove_column("admin_users","salt")rename_column("admin_users","hashed_password","password")remove_column("admin_users","password")remove_column("admin_users","email")remove_column("admin_users","username")rename_table("admin_users","users") endend
靠上面的位置,我们使用rename_table命令将表名从users改为了admin_users。可是请注意,迁移文件的这些操作,模型文件并不知道。换句话说,User依然以为与自己关联的表叫做users,但很显然现在已经不是了。
rename_table("users","admin_users")
这样一来就违背了Rails的规则,实际工作中是有可能出现这种情况的。比如说摆在我们面前的是一个老系统,不能按照我们的要求修改表名。我们来尝试自我修复一下,有两种方法。
第一种是调用ActiveRecord中内建的set_table_name方法,告诉User类与你对应的表名从现在起是admin_users了。第二种方法是将User类名改为AdminUser,文件名改为admin_user。
- Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
- ruby on rails 的模型测试
- Ruby on Rails中的ORM(对象关系模型)一。
- ROR模型和数据库操作(第六章ruby on rails)
- ruby on rails 新建模型,模型间设置关联,表单验证
- Ruby on Rails学习笔记(4)--撤销生成的控制器/模型以及数据库迁移的回滚(撤销)
- Ruby on Rails,一个简单的CMS系统,创建应用骨架并与数据库连接
- Ruby on Rails学习笔记(5)--关于出错信息ActiveRecord::UnknownPrimaryKey in **(模型名称复数)Controller#show的解决办法
- ruby on rails 与grails
- Ruby on Rails,通过页面链接向Controller中传递参数,附赠调试技巧
- Ruby on Rails,创建一个最简单的站点。
- Ruby on Rails,创建开发用的MYSQL数据库
- ruby on rails创建的页面访问非常慢
- ruby on rails 【语法大全2】【模型(Models)】数据库迁移(Migrations)
- Ruby on Rails Tutorial 学习笔记 --第六章 用户模型
- ruby on rails 的书
- Ruby on Rails的神奇
- ruby on rails的session
- 黑马程序员_JavaSE基础01 之 环境变量、临时环境变量、classpath
- oracle group by 深入理解
- 持续集成工具是怎样炼成的?持续集成工具实战
- 经典c/c++面试试题
- 孔群
- Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
- WebKit源码解析之WebCore::Length
- 微软等数据结构与算法面试100题 第二十题
- GNU ARM 汇编程序设计(总结)
- spinner 中如何添加图片
- 10位IT领袖给应届毕业生的10条忠告
- vb滑轮安装出错——错误代码0x80004005
- 数据结构笔记五-2 (20120901)
- 类型转换---struts2学习笔记