рельсы, если объект в массиве - PullRequest
2 голосов
/ 06 декабря 2009

Мне нужно проверить, если для каждого элемента в @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 ]

5 голосов
/ 06 декабря 2009

Вы правы, он всегда будет возвращать 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 %>
3 голосов
/ 06 декабря 2009

Как было указано выше, это зависит от того, по какому критерию вы сравниваете объекты в 2 массивах.

  • Если объекты одного и того же класса (или одного и того же предка), то include? будет работать.
  • Если объекты разные, и вы хотите сравнить только их идентификаторы (хотя это не имеет особого смысла), это будет примерно так:

    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
    

    Вы можете сделать это с любым атрибутом, а не только с идентификатором.

  • Если в обоих случаях ваши объекты представляют собой простые строки или символы, убедитесь, что вы конвертируете все в строку или символ. Иногда я забываю, и сравнения оказываются ложными.

1 голос
/ 06 декабря 2009

@line_items & @quote_items должен возвращать массив, который включает в себя общие элементы между ними. @ line_items - @quote_items вернуть элементы, которые находятся в @line_items, но не в @quote_items. Однако ваш код должен работать, вы уверены, что между ними есть общие элементы? Обратите внимание, что равенство элементов проверяется оператором ==, поэтому вам может потребоваться указать это для вашего класса элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...