2016-01-24 45 views
0

我有有许多设施查询相结合的记录

一个模型我有一个公司模型有很多company_mappings。通过company_mappings一个北美经销商可以有很多设施,无论是通过或直接从设施,他们都通过在多态关联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,但是出现错误。

回答

1

做到这一点的一种方法是提供一个实例方法,分别查询两个关系,获取结果并将它们组合。尝试添加这对您的公司模式:

def all_facilities 
    facilities + facilities_from_chains 
end 

结果结合在一起成为这样一个数组将导致您的结果与关系对象(你可以呼吁例如进一步.where条款)转换为数组,它不能链接更多的AR语句。值得记住这一点。

可能还有其他方法可以通过单个SQL查询来完成此操作,但这看起来像是数据库性能潜在花费的最简单实现。

+0

谢谢@jon,但即时通讯寻找回活跃的记录关系。如果我能找到一种方法,我也会自己试着回答 – coderVishal

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这将做一个左外连接。然后对于每个设施记录来查找它是否属于任何链条的一部分公司相关联,否则如果其company_mappings.company_id等于呼叫公司的ID。