Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails if object in an array

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.

like image 898
JP Silvashy Avatar asked Mar 13 '26 03:03

JP Silvashy


2 Answers

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 image 137
nas Avatar answered Mar 14 '26 16:03

nas


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.

like image 32
Max Chernyak Avatar answered Mar 14 '26 16:03

Max Chernyak



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!