Rails belongs_to 两个模型之一
Rails belongs_to one of two models
我正在使用两个不同的模型 Person
和 Organization
。在许多其他属性中,Person
和 Organization
都可以是 Contractor
。如果我只使用 Person
模型并想存储承包商信息,我会说 Contractor
belongs_to :person
并完成它。然而,这似乎 Contractor
属于另外两个模型。
我在 google 上四处搜索,发现了很多关于如何同时将所有权分配给两个不同模型的信息。 (例如 Sale
必须同时属于 Buyer
和 Seller
。)但是在我的情况下 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'
...
我正在使用两个不同的模型 Person
和 Organization
。在许多其他属性中,Person
和 Organization
都可以是 Contractor
。如果我只使用 Person
模型并想存储承包商信息,我会说 Contractor
belongs_to :person
并完成它。然而,这似乎 Contractor
属于另外两个模型。
我在 google 上四处搜索,发现了很多关于如何同时将所有权分配给两个不同模型的信息。 (例如 Sale
必须同时属于 Buyer
和 Seller
。)但是在我的情况下 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'
...