代码之家  ›  专栏  ›  技术社区  ›  Zabba fl00r

桌子上的混乱

  •  1
  • Zabba fl00r  · 技术社区  · 14 年前

    在铁轨上 ActiveRecord Associations 导游,我不明白为什么桌子 has_one has_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??
    

    桌子不应该 有一个 改成这样:

    suppliers(id,name,account_id) #Foreign Key to account here
    accounts(id,account_number)
    

    现在因为 account_id 在供应商表中,供应商不能有多个帐户。

    导轨中的示例是否不正确?

    有很多 many 远离发生?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Steve Ross    14 年前

    如果我正确地理解了你的问题,你认为在一个有一个/属于一个的关系中存在一个双向的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的一个退化情况,只是添加了使关联和其他一些nit奇异的语法糖。否则,这几乎是同一件事,这也是他们长得很像的原因。

        2
  •  2
  •   nonopolarity    14 年前

    一个客户可以有多个订单,因此每个订单记录都指向客户。

    一个供应商可以有一个账户,这是“有多个”的特例,所以它同样适用于账户指向供应商的情况。

    多对多也是一样,连接表指向单个记录。。。(如果一个学生可以上很多课,一个班可以有很多学生,那么招生表会指向学生和班级记录)。

    至于为什么account指的是supplier,account指的是supplier,我不完全确定我们是否可以用任何一种方式,或者一种形式比另一种更好。

        3
  •  2
  •   MunkiPhD    14 年前

    has_one rails将尝试强制每个供应商只有一个帐户。但是 has_many ,不会强制执行任何约束,因此 允许存在多个帐户。

    在rails中考虑关系及其创建时,确实需要一些人习惯。如果要在数据库端强制使用外键(因为rails不在应用程序层之外执行此操作),请查看 Mathew Higgins' foreigner