Rails ActiveRecord数据库关系1:1

     如图所示,在demo数据库中有suppliers和accounts两张表。一个supplier有一个account,一个account属于一个supplier,是一个1:1关系。


1.建立数据表

 

2.修改model,添加关系

    在这个1:1关系中,accounts拥有外键supplier_id,所以需要在account.rb中添加belongs_to关系,相对应在supplier.rb中添加has_one关系。注意rails的约定,用rails g命令创建model时使用单数形式(首字母大小写无所谓),得到的数据库的表名是小写的复数形式,model的类名是驼峰形式的单数形式,model文件名是小写单数形式。



    对于1:1关系,有几个常用的可选项:

:dependent: 对于has_one关系的一方(supplier),可以添加:dependent选项为destroy, delete,nullify,destroy表示删除supplier会同时删除它拥有的account(包括内存对象和数据库记录),delete表示删除supplier会删除拥有account的数据库记录但不调用其destroy销毁内存对象,nullify表示删除supplier会解除和account的关系,即仅将其拥有account中的外键置为NULL。

:inverse_of: 该选项成对出现,保证一对关系中的数据同步,避免出现下面的情况:


     所以,再次修改model:



3.关系操作

      在建立1:1关系后,关系的两端都自动添加了如下方法来创建关系:


     即,在rails中可以这样使用:


      需要注意的是,对于association=()方法,在1:1关系的两端的工作是不一样的。


      这个问题对于1:n关系也同样存在,在1的一方建立关系会自动保存,在多的一方建立关系不会自动保存。对于什么时候应该使用save方法,什么时候不必使用,有一个好记的规则,如果model包含外键,那么在该model上调用association=()建立的关系需要save(如上例的account),反过来如果model不包含外键,则不需要(如上例的supplier)。

      解除关系:


     在本例中,上述两种办法都可以解除关系,并且会删除account对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值