rails如果数组中的对象

时间:2009-12-06 09:01:30

标签: ruby-on-rails ruby

我需要检查@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?似乎没有按照我想要的方式运作。似乎一直对我产生错误。

3 个答案:

答案 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中的项目。您的代码应该可以使用,您确定它们之间有共同的项目吗?请注意,项目相等性由==运算符检查,因此您可能需要为项类提供该项。