簡體   English   中英

rails:查詢has_many以獲取對象列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM