Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何循环使用多个值的散列并使用destroy?_Ruby On Rails - Fatal编程技术网

Ruby on rails 如何循环使用多个值的散列并使用destroy?

Ruby on rails 如何循环使用多个值的散列并使用destroy?,ruby-on-rails,Ruby On Rails,我有以下代码: a = {"type1"=>[11], "type2"=>[12], "type3"=>[13, 14]} a.each do |i, k| record = Model.where(type: i, id: k) record.destroy if record end 在第1次迭代中,销毁操作可以很好地处理: Model.where(类型:type1,id:11) 在第二次迭代中,销毁操作可以很好地处理: Model.where(类型:type2

我有以下代码:

a = {"type1"=>[11], "type2"=>[12], "type3"=>[13, 14]}

a.each do |i, k|
  record = Model.where(type: i, id: k)
  record.destroy if record
end
在第1次迭代中,销毁操作可以很好地处理:

Model.where(类型:type1,id:11)

在第二次迭代中,销毁操作可以很好地处理:

Model.where(类型:type2,id:12)

在第三次迭代中,销毁操作失败:

Model.where(类型:type3,id:[13,14])

在第三次迭代中,
destroy
将失败,因为查询返回两条记录,destroy操作将失败,因为它发送了错误数量的参数(1而不是2)

如果我使用
destroy\u all
,它将在第三次迭代中有效,但在前两次迭代中失败


如何修复上述解决方案?

在这种情况下,您可以使用每个解决方案

Model.where(type: i, id: k).each{|record| record.destroy}
如果找不到,它将起作用,因此无需检查它是否存在,在一次或多次发生时


您也可以尝试
delete\u all

您是否确实尝试过运行此代码?
destroy
操作在任何迭代中都不起作用,包括前两个迭代。是的,我尝试了上面的代码块,对于前两个条件,它会起作用。你能解释一下你在这里发现的错误吗。
destroy\u all
将适用于所有三次迭代,而不仅仅是最后一次。但是,在不了解更多上下文的情况下,我无法建议这是否是“正确”的解决方案——例如,是否有任何回调,例如
dependent:destroy
?是否有任何
id
数组非常长?此外,您的代码有双重错误:
record.destroy if record
将始终调用
destroy
,因为您的“记录”实际上是一组记录,即使是空的集合也是“真实的”。因此,即使没有找到任何记录,您的代码也将有效地执行:
Model.none.destroy#=>ArgumentError:参数数目错误(给定0,预期为1)
OK,总结一下:该循环中唯一需要的代码是
Model.where(type:i,id:k)。destory\u all
。但是,正如我上面所说的,可能有更好的解决方案(速度/性能方面)取决于应用程序的上下文:即,您可以使用
delete\u all
,并且您可以从批量执行大规模删除中获益匪浅。我需要了解更多的背景来提供建议。我认为OP对什么有效,什么无效感到困惑。简单地使用
destroy\u all
/
delete\u all
应该在所有3种情况下都有效。甚至更短:
Model.where(type:i,id:k)。每个(&:destroy)