如何检查2个不同对象的数组?

时间:2009-10-22 03:52:38

标签: ruby-on-rails

我想检查索赔项目中是否有资产,而@item_assets基本上会获取数据库中被归类为资产的所有项目。

执行以下操作时:

>> @claim.items
=> [#<Item id: 8, name: "chair", amount: 10.0, gst: 0.7, override: false, item_category_id: 7, item_expense_id: 8, claim_id: 8, club_id: 71, created_at: "2009-10-18 10:16:10", updated_at: "2009-10-18 10:16:10">, #<Item id: 9, name: "soemthing", amount: 20.0, gst: 1.4, override: false, item_category_id: 7, item_expense_id: 7, claim_id: 8, club_id: 71, created_at: "2009-10-18 10:16:10", updated_at: "2009-10-18 10:16:10">]

>> @items_assets
=> [#<Item id: 8, name: "chair", amount: 10.0, gst: 0.7, override: false, item_category_id: 7, item_expense_id: 8, claim_id: 8, club_id: 71, created_at: "2009-10-18 10:16:10", updated_at: "2009-10-18 10:16:10">, #<Item id: 9, name: "soemthing", amount: 20.0, gst: 1.4, override: false, item_category_id: 7, item_expense_id: 7, claim_id: 8, club_id: 71, created_at: "2009-10-18 10:16:10", updated_at: "2009-10-18 10:16:10">]

>> @claim.items.include? @items_assets
=> false

结果让我感到困惑。经过调查,我意识到两个数组上的项目都是不同的对象,即使它们引用相同的id。

因此,似乎包括?在这种情况下不能再工作了。

有人可以建议我如何检查索赔项目中是否有资产?

Claim HM Items
Items BT Claim

1 个答案:

答案 0 :(得分:1)

@claim.items.include? @items_assets

你在这里问的是“数组@claim.items是否包含一个等于@item_assets对象的元素?”

您似乎想问的是“数组@claim.items是否包含与另一个数组@item_assets中的任何元素相等的元素?”

如果@claim.items != @claim.items - @item_assets中的任何元素与@item_assets中的任何元素匹配,则

@claim.items将返回true,但这样做的表现可能会非常糟糕。

我会考虑将@item_assets存储在Set中,假设您确实希望将它们全部存入内存。然后检查@claim.items元素是否出现在Set中会更快。