Ruby on rails 按id查找数组中每个整数的记录
我有一个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 @
[“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集:)
谢谢你的详细解释。真的很感激!谢谢你的详细解释。真的很感激!