簡體   English   中英

如何在Rails中包含()另一個表,以便獲得子對象

[英]How to includes() another table in Rails so that I get child objects

給這個標題添加標題確實很困難-請根據自己的喜好進行調整。

本質上,我想在Rails中這樣做:

SELECT airports.*, observations.*
FROM airports
LEFT OUTER JOIN observations ON airports.id = observations.airport_id
WHERE airports.latitude > 51 AND airports.latitude < 52 AND airports.longitude > 0.5 AND airports.longitude < 2
AND (observations.month = 10 OR observations.month IS NULL)

這給了我一個不錯的結果,在邊界框中列出了機場以及它們的觀測值,無論它們是否有。

如何在Rails 3中做到這一點? 無論我嘗試什么,我都只會在結果數組中獲得機場,而根本沒有觀察到。 我可以通過做一個include並指定一個條件來形成SQL,就像這樣:

Airport.includes(:observations)
.where('observations.month = 10 OR observations.month IS NULL')
.where("airports.latitude > 51 AND airports.latitude < 52 AND airports.longitude > 0.5 AND airports.longitude < 2")

這很棒,它給了我與上面寫的一樣的sql:

SELECT `airports`.`id` AS t0_r0, `airports`.`name` AS t0_r1, `airports`.`city` AS t0_r2,
`airports`.`country` AS t0_r3, `airports`.`iata` AS t0_r4, `airports`.`icao` AS t0_r5, 
`airports`.`latitude` AS t0_r6, `airports`.`longitude` AS t0_r7, `airports`.`altitude` AS 
t0_r8, `airports`.`timezone` AS t0_r9, `airports`.`dst` AS t0_r10, `airports`.`created_at`
 AS t0_r11, `airports`.`updated_at` AS t0_r12, `observations`.`id` AS t1_r0, 
`observations`.`airport_id` AS t1_r1, `observations`.`month` AS t1_r2, 
`observations`.`temperature_max` AS t1_r3, `observations`.`temperature_min` AS t1_r4, 
`observations`.`chance_of_rain` AS t1_r5, `observations`.`rain_avg` AS t1_r6, 
`observations`.`dew_point` AS t1_r7, `observations`.`created_at` AS t1_r8, 
`observations`.`updated_at` AS t1_r9, `observations`.`fortnight` AS t1_r10 FROM `airports`
 LEFT OUTER JOIN `observations` ON `observations`.`airport_id` = `airports`.`id` WHERE 
(observations.month = 10 OR observations.month IS NULL) AND (airports.latitude > 51 AND 
airports.latitude < 52 AND airports.longitude > 0.5 AND airports.longitude < 2)

但是記錄結果令人失望。 無觀測值(紹森德應該有觀測值):

[#<Airport id: 14343, name: "Southend", city: "Southend", country: "United Kingdom",
iata: "SEN", icao: "EGMC", latitude: 51.5714, longitude: 0.695556, altitude: 49, 
timezone: 0, dst: "E", created_at: "2011-12-08 11:27:28", updated_at: "2011-12-08 
11:27:28">, #<Airport id: 14345, name: "Manston", city: "Manston", country: "United 
Kingdom", iata: "MSE", icao: "EGMH", latitude: 51.3422, longitude: 1.34611, altitude: 
178, timezone: 0, dst: "E", created_at: "2011-12-08 11:27:28", updated_at: "2011-12-08 
11:27:28">, #<Airport id: 15292, name: "Ashford", city: "Lympne", country: "United 
Kingdom", iata: "LYM", icao: "EGMK", latitude: 51.0833, longitude: 1.01667, altitude: 
351, timezone: 0, dst: "E", created_at: "2011-12-08 11:27:29", updated_at: "2011-12-08 
11:27:29">, #<Airport id: 20740, name: "Ferry Port", city: "Dover", country: "United 
Kingdom", iata: nil, icao: "\\N", latitude: 51.1269, longitude: 1.33975, altitude: 6, 
timezone: 0, dst: "E", created_at: "2011-12-08 11:27:38", updated_at: "2011-12-08 11:27:38">] 

看來我在這里缺少基本的東西。 有什么線索嗎? 謝謝。

結果對象不會出現在結果集中,但會急切加載以避免在需要時查詢對象。

http://guides.rubyonrails.org/active_record_querying.html

Active Record使您可以預先指定將要加載的所有關聯。 通過指定Model.find調用的include方法可以實現。 通過包含,Active Record可確保使用盡可能少的查詢數來加載所有指定的關聯。

clients = Client.includes(:address).limit(10)

clients.each do |client|
  puts client.address.postcode
end

上面的代碼將僅執行2個查詢,而在前面的情況下為11個查詢:

SELECT * FROM clients LIMIT 10
SELECT addresses.* FROM addresses
  WHERE (addresses.client_id IN (1,2,3,4,5,6,7,8,9,10))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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