Best way to test for existence in a joined model

Hi all, given these relationships

class Order < ActiveRecord::Base   belongs_to :item

class Item < ActiveRecord::Base   has_many :orders

@items = Item.find( :all )

@items.each do |item| ...

What's the best way to test for existence of an "item" in the Order database?

Many TIA, Craig

@order = Order.find(:first, :conditions => 'whatever', :include => :items )

@item = @order.items.find( :first, :conditions => 'whatever' ) if @order

Thanks super, Greg, for helping me out. I'm dense, 'cause I couldn't figure out the syntax for 'whatever'. I did get this to work in the .erb file:

<% if Item.find( item ).orders.size > 0 %>   <%=h "Found #{item.title} in Orders" %> <% end %>

But I'm just wondering... is that the most efficient way to do it? Is there a more efficient way?

Thanks for putting in the time to help this noob out, Craig

Thanks super, Greg, for helping me out. I'm dense, 'cause I couldn't figure out the syntax for 'whatever'. I did get this to work in the .erb file:

<% if Item.find( item ).orders.size > 0 %>

I'd go with orders.empty?

You will want to do your find in the controller. Set the results to an instance variable.

@item = Item.find(...)

Then that instance variable is available in your view:

<%= debug @item %>

   &lt;%=h &quot;Found \#\{item\.title\} in Orders&quot; %&gt;

<% end %>

But I'm just wondering... is that the most efficient way to do it? Is there a more efficient way?

Depends on your app. You might want that :include => :items or you might not. It'll save a bunch of smaller queries later if you leave it off, but then what if you needed all those items? It's up to you.

Isn't that the wrong way round?

Colin

Thanks super, Greg, for helping me out. I'm dense, 'cause I couldn't figure out the syntax for 'whatever'. I did get this to work in the .erb file:

<% if Item.find( item ).orders.size > 0 %>

What is item here, is it already an Item object? If so then all you need is if item.orders.empty? No need to find it again.

Arguably better would be to provide a method in Item, possibly 'orders?' that indicates whether that item has any orders. Then you would use if item.orders? where method orders? of Item returns self.orders.empty? This moves logic from the view into the model which is often worthwhile.

Whenever I see a.b.c I consider whether something should be moved into a model.

Colin