Rails ActiveRecord数据库关系1:n
2013-06-09 15:07
218 查看
如图所示,在demo数据库中有customers和orders两张表。一个customer有多个order,一个order属于一个customer,是一个1:n关系。
![](https://img-blog.csdn.net/20130609112125953)
1.建立数据表
![](https://img-blog.csdn.net/20130609112226593)
2.修改model,添加关系
在这个1:n关系中,orders拥有外键customer_id,所以需要在order.rb中添加belongs_to关系,相对应在customer.rb中添加has_many关系。注意rails的约定,用rails
g命令创建model时使用单数形式(首字母大小写无所谓),得到的数据库的表名是小写的复数形式,model的类名是驼峰形式的单数形式,model文件名是小写单数形式。
类似1:1关系,同样添加inverse_of和dependent选项。此处dependent选项的多了一个delete_all,即:dependent=>:delete_all,表示移除customer时会删除其order的所有数据库记录,但不调用这些order的destroy方法销毁对象。
![](https://img-blog.csdn.net/20130609113522937)
![](https://img-blog.csdn.net/20130609113534656)
3.操作关系
1:n关系中,在belongs_to关系端添加的方法和1:1中类似,不再赘述。在has_many端添加了如下方法:
![](https://img-blog.csdn.net/20130609114618937)
使用举例:
![](https://img-blog.csdn.net/20130609120750343)
4.特殊的1:n关系——自引用关联
如,一个Employee拥有多个下属,同时也拥有一个主管,这就是一个自引用关系表。
![](https://img-blog.csdn.net/20130609122117843)
![](https://img-blog.csdn.net/20130609122130187)
建立好model后,和普通1:n关系使用方法并无二致:
![](https://img-blog.csdn.net/20130609124306968)
5.特殊的1:n关系——多态关系
多态关系(polymorphic)可以看作是一种特殊的1:n关系。考虑一种情况,Emplyee和Picture是1:n的关系,Product和Picture也是1:n的关系,Company和Picture也是1:n的关系,这样,在Picture的model中就需要添加许多的belongs_to关系,这些belongs_to的功能是非常类似的,多态关系就是为了解决这类重复。
以Picture,Employee,Product为例,首先创建数据表。
![](https://img-blog.csdn.net/20130616215542265)
注意在创建pictures时,将所有拥有Picture的model称为owner(也可以取别的名称,如RailsGuide上取名为imageable,个人觉得称为owner更形象),并创建了owner_id和owner_type两个字段,分别表示拥有者model的id和类型。
修改model:
![](https://img-blog.csdn.net/20130616220053453)
![](https://img-blog.csdn.net/20130616220109484)
![](https://img-blog.csdn.net/20130616220135937)
所有拥有picture的model中,都在其has_many关系中添加了选项:as=>:owner,而picture的model中belongs_to关系添加了:polymorphic=>true选项。这样,如果以后还有新的model和picture是1:n的关系,那么在其中写入has_many
:pictures,:as=>:owner即可,不必修改Picture的model及其数据表。
关系的使用:
1.建立数据表
2.修改model,添加关系
在这个1:n关系中,orders拥有外键customer_id,所以需要在order.rb中添加belongs_to关系,相对应在customer.rb中添加has_many关系。注意rails的约定,用rails
g命令创建model时使用单数形式(首字母大小写无所谓),得到的数据库的表名是小写的复数形式,model的类名是驼峰形式的单数形式,model文件名是小写单数形式。
类似1:1关系,同样添加inverse_of和dependent选项。此处dependent选项的多了一个delete_all,即:dependent=>:delete_all,表示移除customer时会删除其order的所有数据库记录,但不调用这些order的destroy方法销毁对象。
3.操作关系
1:n关系中,在belongs_to关系端添加的方法和1:1中类似,不再赘述。在has_many端添加了如下方法:
使用举例:
4.特殊的1:n关系——自引用关联
如,一个Employee拥有多个下属,同时也拥有一个主管,这就是一个自引用关系表。
建立好model后,和普通1:n关系使用方法并无二致:
5.特殊的1:n关系——多态关系
多态关系(polymorphic)可以看作是一种特殊的1:n关系。考虑一种情况,Emplyee和Picture是1:n的关系,Product和Picture也是1:n的关系,Company和Picture也是1:n的关系,这样,在Picture的model中就需要添加许多的belongs_to关系,这些belongs_to的功能是非常类似的,多态关系就是为了解决这类重复。
以Picture,Employee,Product为例,首先创建数据表。
注意在创建pictures时,将所有拥有Picture的model称为owner(也可以取别的名称,如RailsGuide上取名为imageable,个人觉得称为owner更形象),并创建了owner_id和owner_type两个字段,分别表示拥有者model的id和类型。
修改model:
所有拥有picture的model中,都在其has_many关系中添加了选项:as=>:owner,而picture的model中belongs_to关系添加了:polymorphic=>true选项。这样,如果以后还有新的model和picture是1:n的关系,那么在其中写入has_many
:pictures,:as=>:owner即可,不必修改Picture的model及其数据表。
关系的使用:
相关文章推荐
- Rails ActiveRecord数据库关系1:1
- Rails ActiveRecord数据库关系n:n
- rails笔记 activerecord 关系
- 抛开rails使用ActiveRecord连接数据库
- Ruby on rails开发从头来(四十三)- ActiveRecord基础(连接数据库)
- Ruby on rails开发从头来(四十三)- ActiveRecord基础(连接数据库)
- rails ActiveRecord 操作数据库
- [Rails] ActiveRecord无法保存到数据库中,save后自动回滚
- Ruby on Rails,使用关系数据库简介
- Rails 中 ActiveRecord 映射数据库属性的问题
- Ruby on rails开发从头来(四十三)- ActiveRecord基础(连接数据库)
- Ruby on Rails,使用关系数据库简介
- 抛开rails使用ActiveRecord连接数据库
- 如何修改RubyOnRails中ActiveRecord默认的表格名和外键字段映射关系?
- 抛开rails使用ActiveRecord连接数据库
- 关于 rails ActiveRecord 属性 以及 foreign_key 不直接用数据库项目 时的一些讨论
- 关系数据库的查询优化策略三
- Sqoop导入关系数据库到Hive
- Rational Database Design Process 关系数据库设计过程一——定义“关系”(译)