对ROR的一对一关系的理解

在正常的表设计的时候不会发现model引入一对一关系有逻辑问题,但要是遇上不正常的表设计,则要注意处理好model层的一对一关系.

场景:

1个用户拥有一个联系信息

user <--------------- 1:1---------------> contact

一对一的表设计可以把外键关系放在任意一个表.

case 1 将外键关系放在contact表上

create_table(:users) do |t| # cloumns end create_table(:contacts) do |t| t.reference :user end




对应model设置一对一关系

class User < ActiveRecord::Base has_one :contact end class User < ActiveRecord::Base belongs_to :user # columns end




case 2 将外键关系放在user表上

create_table(:users) do |t| t.reference :contact # columns end create_table(:contacts) do |t| # columns end




对应model设置一对一关系

class User < ActiveRecord::Base belongs_to :contact end class User < ActiveRecord::Base has_one :user end





问题:

  观察case1 和 case 2, 可以发现,case1比较正常,表达了user为主表,contact为子表的关系.
然而事实上我们有些情况会将外键关系放在user表上,即case2的情况,而case的model里,却反映的是user表是contact表的一个子表,逻辑上会很奇怪.

问题分析:

这个实际反映出rails中的has_one和belongs_to两个方法的一些trick, 反映出ruby在引用这两个函数时的一些潜归则.

  • model A中使用 has_one B时, 要求目标表(B表)必须有A表的外键A_id
  • model A中使用belongs_to B时, 要求源表(A表)必须有B表的外键, B_id

这也是对的,数据表设计时本来就没有按正常的逻辑来设计表的外键关系(r),就必须遵遁ROR的函数规则.


stackoverflow也讲到这一点了:http://stackoverflow.com/questions/861144/ruby-on-rails-has-one-question

class Person < ActiveRecord::Base has_one :cell # the cell table has a person_id end class Cell < ActiveRecord::Base has_one :person # the person table has a cell_id end
class Person < ActiveRecord::Base belongs_to :cell # the person table has a cell_id end class Cell < ActiveRecord::Base belongs_to :person # the cell table has a person_id end
所以要特别注意一下.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值