I have 2 tables (clients and orders). I have create models for them
both and the relevant belongs_to has_many declarations.
I’ve created a controller which has the following code:
def list_orders
@all_clients = Client.find(:all)
@all_orders = Order.find(:all)
end
I’ve created a view which has the following code:
<% for client in @all_clients %>
<%=h(client.name) %>
<% for order in @all_orders %>
<%=h(order.detail) %>
<% end %>
<% end %>
Now what i want to see is a list of clients with their individual
order details listed underneath. Instead of course im seeing each
client with every client order detail listed underneath. The
problem I have is that I dont know how to pass the current client id
to the order loop to get a true parent/child view.
I’m missing something really basic here, but its stumping me at the
moment.
Here is what I would do. I’m new to this, so perhaps there is a
better way.
I would take out the Order.find statement.
Instead, take advantage of the methods Rails gives you for free when
you set up the belongs_to and has_many relationship.
For example, you could use the following inside your main loop:
for order in client.orders
instead of
for order in @all_orders
class Client
has_many :orders
end
def list_orders
@all_clients = Client.find(:all, :include=>[:orders])
end
for client in all_clients
<%=client.name%>
for order in client.orders
<%=order.id%>
end
end
Fantastic! Thank you both. For those who want a full listing:
TABLES:
DROP TABLE IF EXISTS demo_development
.clients
;
CREATE TABLE demo_development
.clients
(
id
int(10) unsigned NOT NULL auto_increment,
name
varchar(45) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS demo_development
.orders
;
CREATE TABLE demo_development
.orders
(
id
int(10) unsigned NOT NULL auto_increment,
client_id
int(10) unsigned NOT NULL,
description
varchar(45) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
*Create new rails project…
MODELS:
class Client < ActiveRecord::Base
has_many :orders
end
class Order < ActiveRecord::Base
belongs_to :clients
end
CONTROLLER:
class InvoiceController < ApplicationController
def list_orders
@all_clients = Client.find(:all, :include => [:orders])
end
end
VIEW:(list_orders.rhtml)
<% for client in @all_clients %>
<%=client.name%>
<% for order in client.orders %>
<%=order.description%>
<% end %>
<% end %>