在Rails ActiveRecord Associations指南中,我对has_one
和has_many
的表格相同原因感到困惑:
customers(id,name)
orders(id,customer_id,order_date)
Example tables for has_one
:
这些表格在数据库级别还允许供应商拥有多个帐户,但我们只需要每个供应商一个帐户
suppliers(id,name)
accounts(id,supplier_id,account_number) #Foreign Key to supplier here??
has_one
的表格不应该是这样的:
suppliers(id,name,account_id) #Foreign Key to account here
accounts(id,account_number)
现在因为account_id
在供应商表中,供应商永远不会有多个帐户。
Rails指南中的示例是否错误?
或者,Rails是否使用has_many
方法但限制many
部分发生?
答案 0 :(得分:2)
如果你这么想 - 他们都是一样的:
1个客户可以拥有多个订单,因此每个订单记录都会指向客户。
1个供应商可以拥有一个帐户,这是“有很多”的特例,因此它同样适用于指向供应商的帐户。
与多对多情况相同,联结表指向个别记录......(如果学生可以参加多个班级,一个班级可以有很多学生,那么报名表点数回到学生和班级记录)。
至于为什么帐户指向供应商和帐户指向供应商,我不能完全确定我们是否可以使用它,或者一种形式比另一种更好。
答案 1 :(得分:2)
我认为这与约束有关。使用has_one
rails将尝试强制每个供应商只有一个帐户。但是,如果使用has_many
,则不会强制执行约束,因此允许具有has_many
的供应商与多个帐户一起存在。
在考虑关系及其在rails中的创建时,需要一些习惯。如果要在数据库端强制执行外键(因为rails不在应用程序层之外执行此操作),请查看Mathew Higgins' foreigner
答案 2 :(得分:1)
如果我正确理解了您的问题,您认为在has_one / belongs_to关系中双向存在1:1的关系。这不完全正确。你可以:
Class Account
belongs_to :supplier
belongs_to :wholesaler
belongs_to :shipper
# ...
end
account = supplier.account # Get supplier's account
wholesaler = Wholesaler.new
wholesaler.accounts << account # Tell wholesaler this is one of their suppliers
wholesaler.save
我并不是说你的应用程序实际上就是这样,但是你可以看到一个表 - 不,让我们说一个模型 - “属于”另一个模型并不排除属于任何数量的模型。对?所以这种关系真是无限:1。
我应该补充一点,has_one实际上是has_many的退化情况,只是添加了单一化关联和其他一些nits的语法糖。否则,它几乎是一样的,而且它们看起来很相似。