2014-02-08 40 views
0

例如,我有一个ID的阵列 ["2", "3", "2", "3"]找到一个阵列中的每个整数的ID记录

我试图遍历这些数组元素。

@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只返回一条记录,可能是找到的最后一条记录。

你是如何做到的?有没有一种类似这样的方法?

谢谢。

回答

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) } 

通过您的收藏地图迭代,并在每次迭代中收集块的结果一个数组作为返回值。

而实际上,ActiveRecord的是足够聪明,执行WHERE id IN()查询,所以下面是等价的,更高性能的,因为这将只执行一个查询

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

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

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

感谢您给我们详尽的解释。真的很感激它! – JamesDullaghan

1

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

2

你也可以拨打find方法:

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

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

arr = @driver.services.find(service_ids) 

查找接受一个I​​D数组并返回一组记录。

0

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

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

杰夫指出,最好的解决办法是通过整套IDS发现的 - 这是足够的智慧找到了一整套如果你这样做:)

arr = @driver.services.find(service_ids) 
相关问题