0

我有一个看起来像这样的模型(已在此处简化):

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 新手,所以如果我在这里遗漏了任何重要信息,请告诉我。

4

3 回答 3

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
于 2013-08-14T10:19:12.220 回答
0
Order.order('date DESC').group('customer_id')

我猜您的 Order 模型按照惯例没有 customer 字段,它应该是 customer_id

于 2013-08-14T10:14:54.597 回答
0

对于更面向 SQL 的方法,它应该性能更好:

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

它依赖于具有最高 id 的最新订单。

于 2013-08-15T14:09:07.050 回答