您的位置:首页 > 数据库

Rails ActiveRecord数据库关系1:n

2013-06-09 15:07 218 查看
    如图所示,在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及其数据表。

         关系的使用:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: