-1

我有一个对象数组,类型为 Lab,existing_labs和不同的 Labs 数组new_labs==我已经为 Lab定义了自己的比较器。

existing_labs是数据库中已经存在的实验室。 new_labs是否要保存实验室,基于它们已经存在于数据库中。

现在我正在这样做

new_labs.each do |l|
  lab = Lab.new(l)
  exists = existing_labs.map{ |existing_lab| lab == existing_lab }
  lab.save unless exists.include? true
end

这可行,但如果其中一个或两个数组很大,则可能会很慢。我相信必须有更好的方法来做到这一点!

为清楚起见进行编辑:

我的问题是:有没有一种好方法可以使用我的方法返回所有存在于new_labs中但不存在于中的 Lab ?existing_labs==

4

5 回答 5

1

您的问题根本不清楚,但这里是您的代码的重构:

(new_labs.map{|l| Lab.new(l)} - existing_labs).each(&:save)
于 2013-02-04T17:30:43.960 回答
1
new_labs.each do |l|
  lab = Lab.new(l)
  lab.save unless existing_labs.any?{|existing_lab| lab == existing_lab }
end

应该更快一些,因为没有为每个实验室创建真假数组。此外,找到any?一个时退出true

于 2013-02-04T20:26:47.667 回答
0

用它们制作一并应用该difference方法。

于 2013-02-04T17:26:38.460 回答
0

您可以简单地使用以下-方法:

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,3]
> ary1 - ary2
=> [1, 4, 5]

另一个:

ary1.select { |e| not ary2.include? e }

这些方法中的任何一种都意味着在后台进行迭代,但我认为该-方法在性能上获胜,也许几个基准测试会很好。

于 2013-02-04T17:28:13.453 回答
0

返回 array1 中不在 array2 中的元素

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,7,9,3]
> ary1 - ary2
=> [1, 4, 5]

返回 array2 中不在 array1 中的元素

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,7,9,3]
> ary2 - ary1
=> [7,9]
于 2013-02-04T18:32:12.837 回答