![](/img/trans.png)
[英]Rails: How would I retrieve records where child element includes any of another array?
[英]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.