rails:查询has_many以获取对象列表

时间:2017-12-13 13:05:50

标签: mysql ruby-on-rails

我有一个模型City

class City
 belongs_to :country
end

模特街:

//street has an attribute `Type` which can be 1, 2 or 3
class Street
  belongs_to City
end

我想要克罗地亚的所有城市,包括2型街道

这样的事情:

cities = City.find_by_country("Croatie").include_streets_where(type: 2)

所以我得到这样的东西:

[
 {
   name: "Zagreb", 
   country: "Croatia",
   streets: [{name: "street1", type: 2},{name: "street2", type: 2}]
 },
 {
   name: "Split",
   country: "Croatia",
   streets: [{name: "street3", type: 2},{name: "street4", type: 2}]
 }
]

我的解决方案是首先按国家/地区名称获取城市,然后循环浏览每个城市以查询其街道。但我猜是有更好的方法。

1 个答案:

答案 0 :(得分:1)

我假设你的城市has_many :streets,而你的国家/地区类有一个属性name

2层循环不如INNER JOIN高效,你可以用它来组装:(你可以通过在它的末尾附加.to_sql来查看它生成的SQL。)

cities = City.where(country: Country.find_by_name("Croatie"))
             .joins(:streets).where(streets: { type: 2 })

这将返回符合条件的city个对象列表。现在要使其达到您指定的格式,您必须在Ruby端进行一些格式化,因为返回的默认值不是Array类型。这假设你想要一个哈希数组。

formatted_list = cities.map do |city|
  { name: city.name,
    country: city.country.name,
    streets: list_of_streets_with_type(city.streets) }
end

def list_of_streets_with_type(streets)
  streets.map do |street|
    { name: street.name,
      type: street.type }
  end
end

最后,formatted_list将返回您想要的内容。 (免责声明:我没有检查语法,但总的想法就在那里。试一试,它应该有效)