我的链模型有很多设施
我有公司模型有很多 company_mappings 。通过 company_mappings , comapny 可以通过链或直接从设施拥有许多设施,两者都通过 companies_mapping 模型中的多态关联。
Company_Mapping 模型
belongs_to :company
belongs_to :company_associations, polymorphic: true
链模型
has_many :company_mappings, as: :company_associations
has_many :facilities
设施模型
has_many :company_mappings, as: :company_associations
belongs_to :chain
现在我有公司模型有两个不同的查询来获得其相关的设施。我想有一个查询来获取从公司
关联的所有设施公司模型
has_many :company_mappings
has_many :chains, through: :company_mappings, source: :company_associations, source_type: "Chain"
has_many :facilities, through: :company_mappings, source: :company_associations, source_type: "Facility"
has_many :facilities_from_chains, through: :chains,source: :facilities, class_name: 'Facility'
我想将设施和_facilities_from_chains_合并到一个查询中,或者能够以某种方式合并它们。我尝试使用 .merge ,但这会产生错误。
答案 0 :(得分:1)
实现此目的的一种方法是提供一个实例方法,该方法分别查询两个关系,获取结果并将它们组合在一起。尝试将此添加到您的公司模型:
def all_facilities
facilities + facilities_from_chains
end
将结果组合到一个像这样的单个数组中会导致结果从关系对象(例如,你可以进一步调用.where
子句)转换为一个你不能链接更多AR语句的数组至。值得记住这一点。
使用单个SQL查询可能有另一种方法可以做到这一点,但这似乎是最容易实现DB性能的最简单实现。
答案 1 :(得分:0)
我找到了一种方法以防万一有什么想知道如何。
scope :company_facilities, -> (chain_ids,company_id){
includes(:company_mappings)
.where("chain_id IN (?) OR (company_mappings.company_associations_type=? and company_mappings.company_id=?)", chain_ids , "Facility", company_id)
.references(:company_mappings)
}
我们的想法是包含 Company_Mapping ,它会执行左外连接。然后,对于每个设施记录,如果其公司_mappings.company_id等于呼叫公司的ID,则查找它是否属于任何链的一部分,公司与其他相关联。