Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 有没有更有效的方法来查找属于记录的内容?_Ruby On Rails 4_Associations - Fatal编程技术网

Ruby on rails 4 有没有更有效的方法来查找属于记录的内容?

Ruby on rails 4 有没有更有效的方法来查找属于记录的内容?,ruby-on-rails-4,associations,Ruby On Rails 4,Associations,鉴于这些模型: Class Location < ActiveRecord::Base has_many :devices end 有没有比这更有效的方法。每个循环?在提问之前应该仔细考虑一下,但答案相当简单: locations = Location.near("some address") # using Geocoder :) location_ids = locations.map{|loc| loc.id}.join(',') # creates string of Loc

鉴于这些模型:

Class Location < ActiveRecord::Base
  has_many :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个位置的列表进行测试。
。每个
循环大约需要11秒(挂钟),这种方式几乎是瞬时的

请注意,在
设备.where
语句中,我使用
{location\u id}
而不是更安全的
[“location\u id in(?)、location\u id]
。这是因为使用array condition语句将产生以下SQL(至少对于MySQL):

它仅查找位置_id为5565的设备

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})")
SELECT `devices`.* FROM `devices` WHERE (location_id in ('5565,5098,2293'))