混淆了has_one和has_many的表

时间:2010-10-17 04:06:27

标签: ruby-on-rails activerecord associations

在Rails ActiveRecord Associations指南中,我对has_onehas_many的表格相同原因感到困惑:

Example tables for 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部分发生?

3 个答案:

答案 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的语法糖。否则,它几乎是一样的,而且它们看起来很相似。