2015-07-02 7 views
0

Я работаю с двумя разными моделями Person и Organization. Среди многих других атрибутов как Person, так и Organization может быть Contractor. Если бы я работал только с моделью Person и хотел бы сохранить информацию о подрядчике, я бы сказал, что Contractorbelongs_to :person и покончим с этим. Однако это похоже на то, что Contractor относится к двум другим моделям.Rails принадлежит_ одной из двух моделей

Я искал в google и нашел много информации о том, как назначить право собственности на две разные модели одновременно. (Например, Sale должен принадлежать как Buyer, так и Seller.) Но в моей ситуации Contractor равен a Person или Organization. Есть ли способ элегантно хранить Contractor информацию для обеих моделей в той же таблице?

Если нет, я полагаю, что всегда могу сделать два разных стола подрядчика, но я подумал, что это может быть возможностью чему-то научиться. Спасибо заранее.

ответ

1

Возможно, вы можете попробовать это. Рельсы обеспечивают polymorphic-associtions. Вы можете попытаться построить одну модель под названием ContractorInfo, относящуюся к Contractable (use polymorphic: true), тогда Person has_one ContractorInfo как контрактный, Organization has_one ContractorInfo as Contractable.

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' 
    ... 
Смежные вопросы