2012-02-10 2 views
4

SCENARIO У меня есть стол, полный сообщений с таблицей пользователей. Я хочу, чтобы иметь возможность загружать все сообщения и группировать их пользователями, но я хочу, чтобы установил предел, равный 10 на пользователя.Активная запись LIMIT в пределах GROUP_BY

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :posts 
end 

# I thought this might work but it just grabs the first 10 posts and groups them 
Post.find(:all, :limit=>10).group_by(&:user) 

Любые мысли? Должен ли я писать собственный SQL для Active Active Record или делать это?

+0

Это ограничивает выборку до 10 для всех пользователей, а не * для каждого пользователя * по мере того, как вы запрашиваете. Возможно, вы захотите пометить это с помощью MySQL или любого другого RDMBS, который вы используете, если для этого требуется конкретный оператор SQL. – tadman

+0

Хорошо спасибо Я добавил тег sqlite3 к сообщению – alenm

+0

Я не думаю, что это специфичный для БД. ActiveRecord может справиться с этим сам по себе. Я обновил свой ответ, чтобы отразить это. –

ответ

0

Что-то вроде?

Post.group(:user_id).limit(10) 
+0

избили меня = P –

+0

Это не то, что мне нужно, комментарий от tadman лучше иллюстрирует то, что я пытаюсь достичь. Я надеюсь, что activerecord может это сделать, и я могу избежать написания каких-либо пользовательских SQL. – alenm

0
Post.group(:user_id).limit(10) 

group_by не метод запроса, а скорее метод Enumerable.

В вашем коде Post.find(:all, :limit => 10) превращен в Array перед тем, как его отправят в group_by. Метод выше объединяет методы запросов и преобразует их только в Array, когда вам нужно их использовать.

ActiveRecord обрабатывает все это. Вышеуказанный метод переводится в

SELECT `posts`.* FROM `posts` GROUP BY user_id LIMIT 10 
+0

Я нахожусь в консоли rails, пытаясь разобраться, и я не вижу, как это работает. Я пытаюсь вернуть хеш, чтобы я мог итерации показывать максимум 10 сообщений на пользователя. – alenm

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