如何创建 HABTM 与 STI 模型 sub-类 的关联?

How to create HABTM association with STI model sub-classes?

假设我有一个名为 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。现在我想在 Countryfirms_n_clients 之间创建一个 has_and_belongs_to_many 关联(只有 FirmClient 类型的 Company)。会怎样?

提前致谢。

has_and_belongs_to_many 协会接受范围。其中一些在 Ruby on Rails documentation 中进行了讨论。假设必要的连接 table 存在,关联可以这样建立:

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 协会的更好方法是合并 firms_n_clients 范围:

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

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