按ID查找数组中每个整数的记录

时间:2014-02-08 01:12:59

标签: ruby-on-rails ruby-on-rails-4

我有一个id的数组 例如["2", "3", "2", "3"]

我正在尝试迭代这些数组元素。

@car = car.first
@driver = @car.drivers.first

service_ids = ["2", "3", "2", "3"]

service_ids.each do |service_id|
  arr = []
  results = @driver.services.find_by(id: service_id)
  arr << results
end

arr只返回一条记录,可能是找到的最后一条记录。

你是如何做到这一点的?是否有类似这样的rails方法?

感谢。

4 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为您正在实例化块内的数组,以下内容应该可以实现您的目标:

@car = car.first
@driver = @car.drivers.first

service_ids = ["2", "3", "2", "3"]

results = service_ids.map { |service_id| @driver.services.find_by(id: service_id) }

Map遍历您的集合,并在数组中的每次迭代中收集块的结果作为返回值。

实际上,ActiveRecord足够聪明,可以执行WHERE id IN ()查询,因此以下内容相同,性能更高,因为它只执行一个查询

@car = car.first
@driver = @car.drivers.first

service_ids = ["2", "3", "2", "3"]

results = @driver.services.where(id: service_ids)

答案 1 :(得分:2)

您也可以拨打find方法:

@car = car.first
@driver = @car.drivers.first

service_ids = ["2", "3", "2", "3"]

arr = @driver.services.find(service_ids)

find接受一组id并返回一组记录。

答案 2 :(得分:1)

您可以使用where代替find_by。您也可以尝试使用find_all_by

答案 3 :(得分:0)

您的代码失败,因为每次查看另一个service_id时,您都将arr重置为空数组。

如果您在循环之外移动该行:arr = [],原始代码将开始工作(即使它不是理想的解决方案)。

正如杰夫指出的那样,最好的解决方案就是将整组id传递给查找 - 如果你这样做,那就足够聪明地找到一整套:)

arr = @driver.services.find(service_ids)