查询以组合记录

时间:2016-01-24 11:30:57

标签: ruby-on-rails ruby-on-rails-4

我的模型有很多设施

我有公司模型有很多 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 ,但这会产生错误。

2 个答案:

答案 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,则查找它是否属于任何链的一部分,公司其他相关联。