【问题标题】:Use belongs_to association in Rails 4在 Rails 4 中使用 belongs_to 关联
【发布时间】:2015-06-09 08:30:20
【问题描述】:

我正在阅读文档,他们说关于 belongs_to:

指定与另一个类的一对一关联。这种方法 仅当此类包含外键时才应使用。

我有 3 个模型:

Info
Customer
Seller

我需要 Customer 或 Seller 的每个实例都可以链接到 infos 表中的一行。

所以我想我只需要将foreing_key info_id 放在2 个模型中,并指定一个belongs_to :info 关联。

但是当我这样做时:

@customer.info 

它给了我错误,因为正在尝试执行此查询:

SELECT  `auth_infos`.* FROM `auth_infos` WHERE `auth_infos`.`customer_id` = 1 LIMIT 1

但是对于我需要的以及我从文档中理解的内容,它应该执行这个:

SELECT  `auth_infos`.* FROM `auth_infos` WHERE `auth_infos`.`id` = 1 LIMIT 1

我错过了什么?

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4 associations


【解决方案1】:

你应该这样做

信息模型

has_one :customer
has_one :seller

客户模型

belongs_to :info

卖家模式

belongs_to :info

具有 belongs_to 的模型始终包含 外键。所以客户和卖家表会有 info_id 外键。

info_id

之后,您可以让客户和卖家都与信息相关联,反之亦然。

@customer.info
@info.customer
@seller.info
@info.seller

【讨论】:

  • 这对我来说似乎不对。我不想在我的表中有 2 个字段。如果有一天我决定再添加 3 个模型,我最终会得到 5 个字段,每行只使用其中一个。
【解决方案2】:

文档错误地表达了这种关系。 “Belongs_to”没有说明任何关于 other 模型的基数,只是表示无论其他模型是什么,它只能有零或任何“belongs_to”之一。

如果...

Price belongs_to Book
Book  has_one Price

...那么一本书可以有零个或一个价格,一个价格只能属于一本书。

如果...

Price belongs_to Book
Book  has_many Price

...那么一本书可以有零个或多个价格,同样一个价格只能属于一本书。

如果客户或卖家可以可选地拥有最多一个信息,并且 onfo 可以有零个或一个客户或卖家,那么使 Info 多态并让客户和卖家“有一个可通知”(或类似的)。然后信息“belongs_to informable”

【讨论】:

    【解决方案3】:

    您可以使用多态关联。使 Info 模型多态。

    info.rb

    class Info < ActiveRecord::Base
    
      belongs_to :informable, polymorphic: true
    
    end
    

    客户.rb

    class Customer < ActiveRecord::Base
    
      has_one :info, as: :informable
    
    end
    

    seller.rb

    class Seller < ActiveRecord::Base
    
      has_one :info, as: :informable
    
    end
    

    【讨论】:

    • 我遵循了您的解决方案,但它让我在信息表中搜索“customer_id”,而不是 informable_id!
    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多