如何创建 HABTM 与 STI 模型 sub-类 的关联?
How to create HABTM association with STI model sub-classes?
假设我有一个名为 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
。现在我想在 Country
和 firms_n_clients
之间创建一个 has_and_belongs_to_many
关联(只有 Firm
和 Client
类型的 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
这有几个优点:国家模型不需要了解不同的公司类型,修改范围也会影响关联。
假设我有一个名为 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
。现在我想在 Country
和 firms_n_clients
之间创建一个 has_and_belongs_to_many
关联(只有 Firm
和 Client
类型的 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
这有几个优点:国家模型不需要了解不同的公司类型,修改范围也会影响关联。