开发者

rails if object in an array

开发者 https://www.devze.com 2022-12-13 04:15 出处:网络
I need to check, if for each item in @line_items if it is in different array say @quote_items Controller:

I need to check, if for each item in @line_items if it is in different array say @quote_items

Controller:

def index
  @line_items = LineItem.all
开发者_开发技巧  @quote_items = QuoteItem.all
end

View:

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

Is there an easy way to do this? include? doesn't seem to work the way I want. Seems to just yield false for me all the the time.


You are right it will always return false because you are trying to check if the array of @quote_items has a line item object

@quote_items.include?(line_item)

which obviously will always be false because your @quote_items instance is an array of QuoteItem objects and @line_items instance is an array of LineItem object. So they are always different objects.

I think in this situation you may want to compare some common attribute of quote_item and line_item. For example if you want to compare name attribute then

quote_item_names = @quote_items.map(&:name)

and then

<% if quote_item_names.include?(line_item.name) %>
 line_item in quote item! 
<% else %>
 line_item NOT in quote item! 
<% end %>


Like it was pointed out in discussion above — it depends on which criterion you're comparing objects in 2 arrays.

  • If objects are of the same class (or the same ancestor), then include? will work.
  • If objects are different, and you only want to compare their ids (although this makes little sense), it'd be something like this:

    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
    

    You can do the above with any attribute, not just id.

  • If in both cases your objects are plain strings or symbols, make sure you're converting everything to string or symbol. Sometimes I forget and comparisons end up being false.


@line_items & @quote_items should return an array that includes the common items between them. @line_items - @quote_items return items that are in @line_items but not in @quote_items.Your code should work though, are you sure there are common items between them? Note that item equality is checked by the == operator, so you might need to provide that for your item class.

0

精彩评论

暂无评论...
验证码 换一张
取 消