我有一个模型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}]
}
]
我的解决方案是首先按国家/地区名称获取城市,然后循环浏览每个城市以查询其街道。但我猜是有更好的方法。
答案 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
将返回您想要的内容。
(免责声明:我没有检查语法,但总的想法就在那里。试一试,它应该有效)