Rails和Postgres:获取每个客户的最新条目

时间:2013-08-14 10:08:49

标签: ruby-on-rails ruby activerecord

我有一个模型(这里已简化),如下所示:

class Customer < ActiveRecord::Base
    attr_accessor :name
    has_many :orders
end

class Order < ActiveRecord::Base
    attr_accessor :description, :cost, :date
end

我正在使用Postgres - 运行查询的最佳方法是什么,它将返回包含每个客户的最新订单的单个结果?

如果我这样做:

Order.order('date DESC').group('customer')

然后我收到Postgres错误:

PGError: ERROR: column must appear in the GROUP BY clause or be used in an aggregate function

最干净的方法是什么?我是一个Rails新手,所以如果我在这里遗漏了任何重要信息,请告诉我。

3 个答案:

答案 0 :(得分:2)

问题是获取每位客户的最新条目

Customer.all.map{|C| [c.name, c.orders.last]}

将返回一个包含客户名称和最新订单的数组。在视图中它将如下所示:

<% @customers.each do |c| %>
 <%= c.name %> - <%= c.orders.last.cost %>
<% end %>

结果:

  John Travolta - $5454
  Johnny Depp   - $6849

答案 1 :(得分:0)

Order.order('date DESC').group('customer_id')

我猜您的订单模型按惯例没有客户字段,应该是customer_id

答案 2 :(得分:0)

对于更面向SQL的方法,它应该更好地执行:

Order.where("id in (select max(id) from orders group by customer_id)")

它依赖于最近具有最高ID的订单。