2017-04-19 109 views
0

鉴于这些机型:有没有更有效的方法来找到belongs_to记录?

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 

是否有比。每循环更有效的方法?

回答

0

应该想到更多这一点,要求过,但答案很简单:

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}而不是更安全的​​。这是因为使用该阵列条件语句将导致以下SQL(至少为MySQL):

SELECT `devices`.* FROM `devices` WHERE (location_id in ('5565,5098,2293')) 

仅发现的量,LOCATION_ID是5565.

设备
相关问题