Rails belongs_to 两个模型之一

Rails belongs_to one of two models

我正在使用两个不同的模型 PersonOrganization。在许多其他属性中,PersonOrganization 都可以是 Contractor。如果我只使用 Person 模型并想存储承包商信息,我会说 Contractor belongs_to :person 并完成它。然而,这似乎 Contractor 属于另外两个模型。

我在 google 上四处搜索,发现了很多关于如何同时将所有权分配给两个不同模型的信息。 (例如 Sale 必须同时属于 BuyerSeller。)但是在我的情况下 Contractor 要么是 Person 要么是 Organization。有什么方法可以优雅地将两个模型的 Contractor 信息存储在同一个 table?

如果没有,我想我总是可以做两个不同的承包商 table,但我认为这可能是一个学习东西的机会。非常感谢。

也许你可以试试这个。 Rails 提供 polymorphic-associtions。您可以尝试构建一个名为 ContractorInfo 的模型,该模型属于 Contractable(使用多态:true),然后 Person has_one ContractorInfo 为 contractable,Organization has_one ContractorInfo 为 Contractable.

我同意 ShallmentMo,但作为补充,您可以这样定义:

Models

class Contractor < ActiveRecord::Base
  belongs_to :contractable, polymorphic: true 
  ...
end

class Person < ActiveRecord::Base
  ...
  has_many :contractors, as: :contractable
  ...
end

class Organization < ActiveRecord::Base
  ...
  has_many :contractors, as: :contractable
  ...
end

Migrations

create_table :contractors , force: true do |t|
  t.references :contractable, polymorphic: true, index: true
  ...
  t.timestamps null: false    
end

Usage

  def create
    @contractor = Contractor.new(params[:contractor])
    contractable = params[:contractor][:contractable].split(":")
    @contractor.contractable_type = contractable[0] # String: 'Person' or 'Organization'
    @contractor.contractable_id = contractable[1].to_i # Integer: id of 'Person' or 'Organization'
    ...