Ruby on Rails,一对一关联(One-to-One)
来源:互联网 发布:游戏黑手党知乎 编辑:程序博客网 时间:2024/06/06 08:30
在上一篇文章中,我们列举了对象之间可能出现的关联关系。接下来,逐个分析一下每一种关系如何在Ruby on Rails中实现和使用。
- 雇员 has_one:电脑
- 教室 has_one:老师
他们的特点是,对象之间存在唯一的拥有关系。如果一个雇员也可以有多台电脑,不过这就不是今天的话题了,那是一对多关系(One-to-Many)。
场景2:将一张表的内容分离成两张(多张)表,比如- 病人 has_one:住院档案
- 顾客 has_one: 账单地址
他们的特点是,本来这些信息可以放在同一个表中,通过不同的列表示属性。不过为了逻辑更为清晰,将比较独立的属性从主表中拆分出来单独存储。还有一个好处就是,好多情况下主表(病人)信息被访问的几率较大,而从表(住院档案)属性很多并且查询几率较少时,将一个大表分离为多个表可以提高数据库使用效率。
不过说实话,实际应用中依然是较少有机会使用一对一关联,取而代之的应该是一对多关联。
举个例子,一般来说一个顾客只有一个账单地址。但是貌似应该也有多个账单地址的情况。建立对象关系的时候还是要考虑使用一对多关联以应对这种变化。
第1:A是主表,B是从表。
第2:A中id的主键值,在B中作为关联用的外键值。
第3:一般来说需要在A、B类中定义对方的引用,以便能够通过一方找到另一方。
从头开始创建教室和老师模型类
rails g model Teacher class_room_id:integer name:stringrails g model ClassRoom name:string
自动生成了迁移任务。执行rake db:migrate命令让数据库结构生效后可以看出,并没有建立class_room_id的外键依赖关系,和我们通常设计数据库的方式不太一样是不是。
因为Rails 社区习惯不依赖数据库而只做模型层关联。当然了,如果认为应用环境需要数据库层的关联校验,也可以加上数据库外键。
#创建老师表的迁移任务class CreateTeachers < ActiveRecord::Migration def change create_table :teachers do |t| t.integer :class_room_id t.string :name t.timestamps end endend#创建教室表的迁移任务class CreateClassRooms < ActiveRecord::Migration def change create_table :class_rooms do |t| t.string :name t.timestamps end endend
在Teacher模型和ClassRoom模型中分别添加belongs_to和has_one。这样的声明,建立了ClassRoom和Teacher的一对一关联。
Rails神奇的地方来了,belongs_to后面写的是class_room;has_one后面写的是teacher。这种符合人类语言习惯的声明会被惯例的转换为外键依赖,teacher会自动根据class_room_id的值找到所属于的class_room;class_room也会根据teacher表中的id知道它拥有的teacher。如果想显示的设置或者不遵守Rails的约定命名也是可以的,只需要通过:foreign_key=>"class_room_id"指定外键(如注释掉的那行一样)。
#Teacher模型类class Teacher < ActiveRecord::Base belongs_to :class_room #belongs_to :class_room , {:foreign_key => "class_room_id"} attr_accessible :class_room_id, :nameend#ClassRoom模型类class ClassRoom < ActiveRecord::Base has_one :teacher attr_accessible :nameend
用rails console看看效果,创建一个class_room,教室名字是101。
> class_room = ClassRoom.create(:name=>'101')=> #<ClassRoom id: 1, name: "101", created_at: "2012-12-08 17:34:07", updated_at: "2012-12-08 17:34:07">
在创建一个teacher,名字是“abbuggy”。回显内容是teacher的当前状态,class_room_id现在还是nil。
> teacher = Teacher.create(:name=>'abbuggy')=> #<Teacher id: 1, class_room_id: nil, name: "abbuggy", created_at: "2012-12-08 17:36:05", updated_at: "2012-12-08 17:36:05">
因为在Teacher模型类中定义了belongs_to :class_room关系,所以teacher对象能够调用teacher.class_room=方法;同样在class_room对象上能够调用teacher=方法,其实这已经证明类的关联关系已经建立了。彼此关联起来后,再次查看,已经成功建立了对象引用关系。
> class_room.teacher = teacher> teacher.class_room = class_room> class_room.teacher=> #<Teacher id: 1, class_room_id: 1, name: "abbuggy", created_at: "2012-12-08 17:36:05", updated_at: "2012-12-08 17:37:05">
- Ruby on Rails,一对一关联(One-to-One)
- Ruby on Rails,一对一关联(One-to-One)
- Ruby on Rails,一对多关联(One-to-Many)
- Ruby on Rails,一对多关联(One-to-Many)
- Hibernate一对一 主键关联映射(one-to-one)
- Hibernate一对一 主键关联映射(one-to-one)
- hibernate---->一对一关联映射 (one-to-one)
- 一对一 one-to-one
- Hibernate学习笔记:一对一的关联关系(one-to-one)
- Hibernate一对一 主键关联映射(one-to-one)
- Hibernate一对一 外键关联映射(one-to-one)
- Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)
- hibernate 一对一(One-to-One)
- hibernate 一对一(One-to-One)
- hibernate 一对一(One-to-One)
- Ruby on rails开发从头来(五十五)- ActiveRecord基础(一对一关联关系)
- Ruby on rails开发从头来(五十五)- ActiveRecord基础(一对一关联关系)
- hibernate 一对一(one to one)级联保存
- 用字符串解决加减乘除解决不够位
- linux c编程操作数据库(sqlite3应用)
- 【phpcms-v9】phpcms-v9中手机站点
- Linux grep指令详解--实用型
- 《那些年啊,那些事——一个程序员的奋斗史》——125
- Ruby on Rails,一对一关联(One-to-One)
- Spring整合Hibernate中HibernateDaoSupport类的分页处理具体代码
- The Elephant Man——Chapter 3 A Letter to 'The Times'
- 《那些年啊,那些事——一个程序员的奋斗史》连载再开感言
- C++练习之 杨辉三角形
- 安卓学习第一天
- Android推送方案分析(MQTT/XMPP/GCM)
- 安卓学习第二天
- Oracle中的一些通用查询语句