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

パフォーマンスが向上するはずの、よりSQL指向のメソッドの場合:

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

最も高い ID を持つ最新の注文に依存します。

于 2013-08-15T14:09:07.050 に答える