是否有一种更有效的方法可以找到属于记录的属性



给定以下模型:

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的设备。

最新更新