Ruby on rails 按id查找数组中每个整数的记录

Ruby on rails 按id查找数组中每个整数的记录,ruby-on-rails,ruby-on-rails-4,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 @

我有一个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
@car=car.first
@driver=@car.drivers.first
服务_id=[“2”、“3”、“2”、“3”]
服务_id.每个do |服务_id|
arr=[]
结果=@driver.services.find_by(id:service_id)

arr您可以使用
where
而不是
find_by
来实现此目的。您还可以尝试使用
find_all_by

您可以使用
where
而不是
find_by
。您也可以尝试使用
find_all_by

这是因为您正在块内实例化数组,以下操作应该可以完成您想要的操作:

@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
查询,因此以下内容将是等效的,而且性能更高,因为它只执行一个查询

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

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

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

之所以会发生这种情况,是因为您正在块内实例化数组,以下操作应该可以完成您想要的:

@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
查询,因此以下内容将是等效的,而且性能更高,因为它只执行一个查询

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

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

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

您也可以调用
find
方法:

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

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

arr = @driver.services.find(service_ids)

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

您也可以调用
find
方法:

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

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

arr = @driver.services.find(service_ids)

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

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

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

正如Jeff所指出的,最好的解决方案是传递整个ID集进行查找—如果这样做,这足够聪明,可以查找整个ID集:)


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

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

正如Jeff所指出的,最好的解决方案是传递整个ID集进行查找—如果这样做,这足够聪明,可以查找整个ID集:)


谢谢你的详细解释。真的很感激!谢谢你的详细解释。真的很感激!