Rails属于两个模型中的一个

时间:2015-07-02 07:22:29

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

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

我在google上搜索过,发现了很多关于如何一次性将权限分配给两个不同模型的信息。 (例如,Sale必须同时属于BuyerSeller。)但在我的情况下,ContractorPerson或{{{ 1}}。有没有办法在同一个表中优雅地存储两个模型的Organization信息?

如果没有,我认为我总能制作两个不同的承包商表,但我认为这可能是学习一些东西的机会。非常感谢提前。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我同意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'
    ...