如何使用STI模型子类创建HABTM关联?

时间:2016-11-27 01:06:38

标签: ruby-on-rails ruby database-design has-and-belongs-to-many sti

假设我有一个名为Company的STI模型。它有三个子类FirmClientPriorityClient

class Company < ActiveRecord::Base
    scope :firms_n_clients, -> { where(type: %w(Firm Client)) }
end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Company; end

我有另一个名为Country的模型。现在,我想在has_and_belongs_to_manyCountry(仅firms_n_clientsFirm类型Client)之间创建Company关联。怎么会这样?

提前致谢。

1 个答案:

答案 0 :(得分:1)

has_and_belongs_to_many关联接受范围。其中一些在Ruby on Rails documentation中讨论过。假设存在必要的连接表,则可以如下建立关联:

class Country < ActiveRecord::Base
    has_and_belongs_to_many :companies, -> { where(type: %w(Firm Client)) }
end

class Firm < Company
    has_and_belongs_to_many :countries
end

class Client < Company
    has_and_belongs_to_many :countries
end

请注意客户和公司中的重复代码。这是有目的的,因为它明确地揭示了客户和公司拥有并属于国家,而PriorityClients则没有。

我没有测试下面的代码,但更好的修改HABTM协会的方法是合并 firm_n_clients 范围:

class Country < ActiveRecord::Base
    has_and_belongs_to_many :companies, -> { merge(Company.firms_n_clients) }
end

这有几个优点:Country模型不需要了解不同的公司类型,修改范围也会影响关联。