Ruby on rails rails if数组中的对象

Ruby on rails rails if数组中的对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我需要检查@line\u items中的每个项目是否在不同的数组中,比如说@quote\u items 控制器: def index @line_items = LineItem.all @quote_items = QuoteItem.all end 视图: 行\报价项目中的项目! 行项目不在报价项目中! ... 有没有一个简单的方法可以做到这一点包含?似乎没有按我想要的方式工作。对我来说似乎一直都是false。@line\u items&@quote\u items应该返回一个

我需要检查
@line\u items
中的每个项目是否在不同的数组中,比如说
@quote\u items

控制器:

def index
  @line_items = LineItem.all
  @quote_items = QuoteItem.all
end
视图:


行\报价项目中的项目!
行项目不在报价项目中!
...

有没有一个简单的方法可以做到这一点<代码>包含?似乎没有按我想要的方式工作。对我来说似乎一直都是false。

@line\u items&@quote\u items
应该返回一个数组,其中包含它们之间的公共项@<代码>行项目-@quote\u项目返回
@line\u项目
中但不在
@quote\u项目
中的项目。但是,您的代码应该可以工作,您确定它们之间存在共同项目吗?注意,item相等性是由==操作符检查的,因此您可能需要为item类提供它

您是对的,它将始终返回false,因为您试图检查@quote\u items数组是否有一个line item对象

@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 %>

行\报价项目中的项目!
行项目不在报价项目中!

就像上面讨论中指出的那样-这取决于比较两个数组中对象的标准

  • 如果对象属于同一类(或同一祖先),则
    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

  • 如果在这两种情况下,对象都是纯字符串或符号,请确保将所有内容都转换为字符串或符号。有时我会忘记,比较结果是错误的


QuoteItem
可以是
LineItem
的超类(或反之亦然),因此它们实际上可以是同一个对象。是的,基本上,我的
line\u项目
有id,如果该对象也存在于另一个数组中(在本例中为
@quote\u项目
),我希望html输出包含一个额外的元素,因此,我提供的视图代码。。。嗯。。我想我只是不知道该怎么解释自己。当你实例化/创建一个对象时,你会得到对象id和对象,比如#对于行项目和#对于队列项目,假设它们只有一个名为name的属性。因此,无论何时对这两个对象进行比较,它都将是错误的,因为无论从另一个对象继承一个对象,它们都不相同。此外,除了继承super类的所有属性和行为外,子类还可以通过拥有自己的状态和行为而与超类不同。有意义吗?@jpsilvashy您正在从LineObject类创建line_对象,并从QuoteItem类创建quote_项。它们可能具有相同的属性并为您类似的行为,但您是从不同的类/类型IE LIN项目和QuoTeIt创建它们,因此Ruby会认为它们是不同的。它们是不同的,但我想看看数据库中的id(字面上是它的主键)是否与我数组中的值匹配,特别是它的key
@quote\u items。原始的\u 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