2013-04-02 2 views
2

У меня есть простой класс, как:Как использовать агрегат в заказе в DataMapper?

class Foo 
    include DataMapper::Resource 
    property :id, Serial 
    property :bar, Text, lazy: false 
    property :created_on, DateTime, default: lambda { |r,p| DateTime.now } 
end 

Я хочу, чтобы выбрать их, сгруппированных по бару и заказал макс (created_on). SQL мне нужно:

SELECT "bar" FROM "foo" GROUP BY "bar" ORDER BY MAX("created_on") DESC 

но я не знаю, как это получить с помощью DataMapper.

Я пытался что-то вроде:

Foo.all(fields: [:bar], unique: true, order: [:created_on.desc.max]) 

, но вы не можете использовать максимум как это. Я не могу понять, как это сделать.

Вы можете помочь?

+1

я имел такую ​​же проблему и не мог понять, «хорошее» решение. То, что я делал, вызывало либо SQL напрямую, либо добавляло поле, которое является совокупностью (что, я думаю, не будет работать в вашем случае). – AlexQueue

ответ

1

Кажется, что использование максимального агрегата не требуется. Заказывая в порядке убывания столбца created_on, он собирается найти MAX и перейти оттуда.

Вы могли бы сойти с рук:

Foo.all(fields: [:bar], unique: true, order: [created_on.desc]) 

без использования .max в порядке.

Это было бы так же, как:

SELECT "bar" FROM "foo" GROUP BY "bar" ORDER BY "created_on" DESC 

Надеется, что это работает.

Также посмотрите на http://datamapper.org/docs/find.html