我需要检查@line_items
中的每个项目是否在不同的数组中说@quote_items
控制器:
def index
@line_items = LineItem.all
@quote_items = QuoteItem.all
end
查看:
<% for line_item in @line_items %>
<% if @quote_items.include?(line_item) %>
line_item in quote item!
<% else %>
line_item NOT in quote item!
<% end %>
...
<% end %>
有一种简单的方法吗? include?
似乎没有按照我想要的方式运作。似乎一直对我产生错误。
答案 0 :(得分:5)
你是对的,它总会返回false,因为你试图检查@quote_items的数组是否有一个行项目对象
@quote_items.include?(line_item)
这显然总是假的,因为你的@quote_items实例是一个QuoteItem对象数组,@ line_items实例是一个LineItem对象数组。所以他们总是不同的对象。
我认为在这种情况下,您可能需要比较quote_item和line_item的一些常见属性。例如,如果要比较名称属性,则
quote_item_names = @quote_items.map(&:name)
然后
<% if quote_item_names.include?(line_item.name) %>
line_item in quote item!
<% else %>
line_item NOT in quote item!
<% end %>
答案 1 :(得分:3)
就像上面讨论中指出的那样 - 它取决于您在2个数组中比较对象的标准。
include?
将起作用。如果对象不同,你只想比较它们的ID(虽然这没什么意义),它就是这样的:
line_item_ids = @line_items.map(&:id) # array of just the attribute we need
@quote_items.each do |quote_item|
if line_item_ids.include?(quote_item.id)
# line item with the same id found
else
# ...
end
end
您可以使用任何属性执行上述操作,而不仅仅是id。
如果在这两种情况下您的对象都是纯字符串或符号,请确保将所有内容转换为字符串或符号。有时我会忘记并且比较最终会变成虚假。
答案 2 :(得分:1)
@line_items & @quote_items
应该返回一个包含它们之间的公共项的数组。 @ line_items - @quote_items
会返回@line_items
但不在@quote_items
中的项目。您的代码应该可以使用,您确定它们之间有共同的项目吗?请注意,项目相等性由==运算符检查,因此您可能需要为项类提供该项。