2013-08-14 2 views
0

У меня есть модель (которая была упрощена здесь), который выглядит следующим образом:Рельсы и Postgres: Как получить последнюю запись для каждого клиента

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, поэтому дайте мне знать, если я оставил всю важную информацию здесь.

ответ

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 
0
Order.order('date DESC').group('customer_id') 

Я думаю, ваша модель заказа не имеет поле клиента по соглашению она должна быть customer_id

0

Для более SQL ориентированного метода, который должен быть лучше исполнительским:

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

Он опирается на наиболее недавний заказ с наивысшим идентификатором.

Смежные вопросы