假设我有一个名为Company
的STI模型。它有三个子类Firm
,Client
和PriorityClient
。
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_many
和Country
(仅firms_n_clients
和Firm
类型Client
)之间创建Company
关联。怎么会这样?
提前致谢。
答案 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模型不需要了解不同的公司类型,修改范围也会影响关联。