Forum: Ruby on Rails Order a find using a has_many association

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
74bd868b70df3590bf94cf7abe563ec4?d=identicon&s=25 jfloyd@binarythinking.com (Guest)
on 2007-04-04 19:38
(Received via mailing list)
I'm trying to order a find through a has_many association.  I have a
model called SalesOrder.  Each sales order has things like amount,
description, etc.  I use the following to get the Sales Orders:

@sales_orders = SalesOrder.find(:all)

And I display them with:

<td><%= link_to sales_order.id.to_s, :action => 'show', :id =>
sales_order.id %></td>
<td><%= sales_order.sold_to %></td>
<td><%= sales_order.ship_to %></td>
<td><%= (sales_order.rep.length < 1 ? "&nbsp;" : sales_order.rep) %></
td>
<td><%= sales_order.description %></td>
<td class="right_align"><%= sprintf("%#1.2f", sales_order.amount) %></
td>
<td><%= sales_order.ship_date.strftime('%m/%d/%y') %></td>
<td><%= sales_order.latest_history.nil? ? "&nbsp;" :
sales_order.latest_history.route.name %></td>

The problem is that this list is not in the order that I need it to
be.  I can order it by any column in the sales_orders table, but I
need to order it by latest_history.route.name  I don't know how to
order a query based on another table's column.  Is this even
possible?  Or is there another way to accomplish the same result?  My
model definitions are below:

class SalesOrder < ActiveRecord::Base
   has_many :histories
   has_one  :latest_history,
            :class_name => "History",
            :order => "id desc"
end

class History < ActiveRecord::Base
   belongs_to :route
   belongs_to :sales_order
end

class Route < ActiveRecord::Base
  has_many :histories
  has_and_belongs_to_many :users

end


Thanks!
Db31811eb76d98459bc9e6cb3f043f55?d=identicon&s=25 Dutch Rapley (Guest)
on 2007-04-04 19:45
(Received via mailing list)
you might want to try this

@sales_orders = SalesOrder.find(:all, :include => [:histories, :routes],
:order => "routes.name")

-Dutch
74bd868b70df3590bf94cf7abe563ec4?d=identicon&s=25 jfloyd@binarythinking.com (Guest)
on 2007-04-04 20:21
(Received via mailing list)
Ok,

I added the following to my SalesOrder model:

has_many :routes, :through => :histories

Then I tried:

@sales_orders = SalesOrder.find(:all, :include =>
[:histories, :routes], :order => 'routes.name')

That partially worked.  It seemed to group together all sales orders
where the route wasn't blank.  But they weren't all grouped together
by the same status.  Here's the order of the routes they were in:

Production Control
Application Data Sheet Approval
Manufacturing Engineering
Released to Shop
Manufacturing Engineering
Manufacturing Engineering
Manufacturing Engineering
Manufacturing Engineering
Project Engineering
Released to Shop

Why weren't the Manufacturing Engineering and Released to Shop routes
all together?

Thanks!
Db31811eb76d98459bc9e6cb3f043f55?d=identicon&s=25 Dutch Rapley (Guest)
on 2007-04-04 22:19
(Received via mailing list)
ah, I'm assuming you want to group sub items together, would you mind
reponding back with you view code?
28c7ef5ffd77ddcaf495aa389103b764?d=identicon&s=25 Jason (Guest)
on 2007-04-04 22:47
Here you go:

<% for sales_order in @sales_orders %>


  <tr>

    <td><%= sales_order.sold_to %></td>
    <td><%= sales_order.ship_to %></td>
    <td><%= sales_order.description %></td>
    <td><%= sprintf("%#1.2f", sales_order.amount) %></td>
    <td><%= sales_order.ship_date.strftime('%m/%d/%y') %></td>

    <!-- this is the column of the table that's not sorting right -->
    <td><%= sales_order.latest_history.nil? ? "&nbsp;" :
sales_order.latest_history.route.name %></td>


  </tr>
This topic is locked and can not be replied to.