2016-01-24 52 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。