如图所示,在demo数据库中有customers和orders两张表。一个customer有多个order,一个order属于一个customer,是一个1:n关系。
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及其数据表。
关系的使用: