如何构建Rails ActiveRecord查询以将属于其他模型的对象分组?

时间:2017-01-06 18:29:37

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

鉴于以下模型:

ServiceCenter
  has_many :country_codes

CountryCode
  belongs_to :service_center

什么是ActiveRecord查询将返回如下内容:

{
  "US": ["United States"],
  "PT": ["Portugal", "Spain", "Estonia"],
  "FR": ["France", "Germany", "Austria"]
}

其中键是每个ServiceCenter的country属性,值是属于它的每个CountryCode的country_name属性?换句话说,我只想要一个CountryCodes属于每个ServiceCenter的列表,仅显示这些属性。

{ 'service_centers.country': 'country_code.country_name', 'country_code.country_name' }

我试过这个:

CountryCode .joins(:service_center) .select('country_codes.country_name', 'service_centers.country') .group('service_centers.country')

但这会返回:

<ActiveRecord::Relation [
  <CountryCode id: nil, country_name: "Portugal">,
  <CountryCode id: nil, country_name: "United States">,
  <CountryCode id: nil, country_name: "Portugal">.....]>

我也尝试了ServiceCenter.joins(:country_code)....但是类似的结果 - 与ServiceID对象的ActiveRecord关系,其id为nil,并且给出了country属性。

我已经查看了与此类似的答案:Get all records grouped by field from association and sorted by count in group,但我不想要计算。

我很感激任何帮助!!

1 个答案:

答案 0 :(得分:2)

不建议您获取以下所有记录,因为它会有优化问题。但是,为了您的理解,您可以尝试:

hash = {}

ServiceCenter.all.each do |service_center|
  hash[service_center.country] = service_center.country_codes.pluck(:country_name)
end

输出hash就像是,例如:

{
  "US": ["United States"],
  "PT": ["Portugal", "Spain", "Estonia"],
  "FR": ["France", "Germany", "Austria"]
}

注意:哈希不能像您指定的那样拥有多个值,它应该采用数组的形式。

修改

不完全是你想要的,但这可能会有所帮助:

ServiceCenter.joins(:country_codes).group("service_center_id").pluck("service_centers.country, GROUP_CONCAT(country_codes.country_name)")

<强>输出

[["US", "United States"], ["PT", "Portugal, Spain, Estonia"], ["FR", "France, Germany, Austria"]]