我有一个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方法?
感谢。
答案 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)