![](/img/trans.png)
[英]Rails query with has_many relation in a list of [types, ids]
[英]rails: query has_many for a list of objects
我有一個示范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}]
}
]
我的解決方案是先按國家/地區名稱獲取城市,然后遍歷每個城市以查詢其街道。 但是我猜測還有更好的方法。
我假設您的城市has_many :streets
,並且您的Country類具有一個屬性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
將返回您想要的內容。 (免責聲明:我沒有檢查語法,但是這里有基本的想法。嘗試一下,它應該可以工作)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.