I am trying to list my orders showing customer names rather than customer IDs. I am not having much luck. I have a table called orders, having a ''customer_id'' field. I also have a table called customers, which has a field called ''id'', as well as a field called ''name''. In the orders model, I specify that order belongs_to customer, and in the customer model, I specify that the customer has_many orders. As a first shot, I assumed that in the list view for orders, I could replace the working line <td><%=h order.send(''customer_id'') %></td> with something like <td><%=h order.send(''order.customer.name'') %></td>. That didn''t work. My current iteration defines the following method in order.rb def self.find_all_denormalized sql = " SELECT orders.*, customers.name as customerName From orders left join customers on customer_id = customers.id " orders_denormalized = Order.find_by_sql(sql) return orders_denormalized end and in order_controller.rdb, I have redefined list as def list @order_pages, @orders = paginate Order.find_all_denormalized, :per_page => 10 end This is not working. I am getting a message like: wrong constant name #<Order:0x394ba68>#<Order:0x394ba20>#<Order:0x394b9d8>#<Order:0x394b990>#<Order:0x394b948> ------------------------------------------------------- Two questions: why is my approach not working, and is there a fundamentally better (more Rails) way to do this? Thanks in advance Ed -- Posted via http://www.ruby-forum.com/.
Jonathan Leonard
2005-Nov-28 05:20 UTC
Re: newbie: displaying a denormalized list of records.
hi Ed, I think part of your problem is that you''re using the built-in paginate instead of this one: def paginate_collection(collection, options = {}) default_options = {:per_page => 10, :page => 1} options = default_options.merge options pages = Paginator.new self, collection.size, options[:per_page], options[:page] first = pages.current.offset last = [first + options[:per_page], collection.size].min slice = collection[first...last] return [pages, slice] end You should use the above function anytime you want to paginate a collection returned from a custom query (just add this func to your application.rb). As for the rails way to get the customer name, you should be able to do: order.customer.name anywhere you have an actual object named ''order'' (in which case you won''t need a custom query at all (or the alternate paginate method above (but it was included for future reference I suppose :)))). This statement is actually calling a method named ''customer_id'' of the order object (see documentation on ''send''). <%=h order.send(''customer_id'') %> The reason why that part of your code isn''t working is because order has no method named ''customer.name''. The proper way to do what you intended is: <%=h order.customer.name %> Hope this helps! --Jonathan Ed Schechter wrote:> I am trying to list my orders showing customer names rather than > customer IDs. I am not having much luck. > > > I have a table called orders, having a ''customer_id'' field. I also have > a table called customers, which has a field called ''id'', as well as a > field called ''name''. > > In the orders model, I specify that order belongs_to customer, and in > the customer model, I specify that the customer has_many orders. > > As a first shot, I assumed that in the list view for orders, I could > replace the working line > > <td><%=h order.send(''customer_id'') %></td> > > with something like > > <td><%=h order.send(''order.customer.name'') %></td>. > > That didn''t work. > > My current iteration defines the following method in order.rb > > def self.find_all_denormalized > sql = " SELECT orders.*, customers.name as > customerName > From orders left join customers > on customer_id = customers.id > " > orders_denormalized = Order.find_by_sql(sql) > return orders_denormalized > end > > and in order_controller.rdb, I have redefined list as > > def list > @order_pages, @orders = paginate Order.find_all_denormalized, > :per_page => 10 > end > > This is not working. I am getting a message like: > > wrong constant name > #<Order:0x394ba68>#<Order:0x394ba20>#<Order:0x394b9d8>#<Order:0x394b990>#<Order:0x394b948> > > ------------------------------------------------------- > > Two questions: why is my approach not working, and is there a > fundamentally better (more Rails) way to do this? > > Thanks in advance > > Ed-- Posted via http://www.ruby-forum.com/.