给定以下模型:
Class Location < ActiveRecord::Base
has_many :devices
end
和
Class Device < ActiveRecord::Base
belongs_to :location
end
我现在能想到的唯一方法是:
dev_list = []
locations = Location.near("some address") # using Geocoder :)
locations.each do |loc|
dev_list += loc.devices
end
是否有比那更有效的方法?
应该在询问之前对此进行更多考虑,但是答案很简单:
locations = Location.near("some address") # using Geocoder :)
location_ids = locations.map{|loc| loc.id}.join(',') # creates string of Location ids: "1,3,5,6,7,12,..."
dev_list = Device.where("location_id IN (#{location_ids})")
针对1000个位置的列表进行了测试。.each
循环花费了大约11秒(壁钟(,这种方式几乎是瞬时的。
请注意,在Device.where
语句中我使用#{location_ids}
,而不是更安全的["location_id IN (?)", location_ids]
。这是因为使用数组条件语句将导致以下SQL(至少对于MySQL(:
SELECT `devices`.* FROM `devices` WHERE (location_id in ('5565,5098,2293'))
仅找到位置_id为5565的设备。