在 Rails 中,如何根据数组中每个对象中的字段执行两个数组的交集?

In Rails, how do I perform an intersect of two arrays based on a field in each object in the arrays?

我正在使用 Rails 4.2.7。我有两个数组(arr1 和 arr2),它们都包含我的模型对象。如果 arr1 中的对象具有与 arr2 中的对象匹配的字段“myfield1”(这是一个数字),是否有办法在两个数组上进行交集?两个数组都有独特的对象集。目前我有

arr1.each_with_index do |my_object, index|
    arr2.each_with_index do |my_object2, index|
        if my_object.myfield1 == my_object2.myfield1
            results.push(my_object)
        end
    end
end

但这让我觉得效率有点低。我想有一种更简单的方法可以得到我需要的结果,但我对 Ruby 还不够熟悉,不知道该怎么做。

您可以构建值的交集以查找共同值,然后 select 具有共同值的记录。

field_in_both = arr1.map(&:myfield1) & arr2.map(&:myfield1)
intersection = arr1.select{|obj| field_in_both.include? obj.myfield1} + 
               arr2.select{|obj| field_in_both.include? obj.myfield1}

我在你的代码中注意到,你只存储来自 arr1 的记录...如果这是正确的行为,那么你可以简化我的回答

field_in_both = arr1.map(&:myfield1) & arr2.map(&:myfield1)
intersection = arr1.select{|obj| field_in_both.include? obj.myfield1}