2011-01-03 2 views
0

Я использую Rails 3 и postgresql. У меня есть следующие жанры: рок, атмосфера, альтернатива, дом.Как получить активные жанры в activerecord?

У меня также есть зарегистрированных пользователей. Один имеет рок, а другой дом, как их жанры. Мне нужно вернуть объекты жанра и дома.

Я нашел два способа сделать это. Один использует группу:

Genre.group('genres.id, genres.name, genres.cached_slug, genres.created_at, genres.updated_at').joins(:user).all 

А другой с помощью DISTINCT:

Genre.select('DISTINCT(genres.name), genres.cached_slug').joins(:user) 

Оба возвращают те же самые желаемые результаты. Но какая из них лучшая производительность? Использование группы() выглядит неаккуратно, так как я должен указать все поля таблицы Жанр иначе я получаю ошибки как таковой:

ActiveRecord::StatementInvalid: PGError: ERROR: column "genres.id" must appear in the GROUP BY clause or be used in an aggregate function 
: SELECT genres.id FROM "genres" INNER JOIN "users" ON "users"."genre_id" = "genres"."id" GROUP BY genres.name 

ответ

1

DISTINCT и GROUP BY обычно генерируют один и тот же план запроса, так что производительность должна быть то же самое в обеих конструкциях запроса.

Поскольку вы не используете агрегатные функции, вы должны использовать тот, который имеет наибольший смысл в вашей ситуации, я считаю, это один:

Genre.select('DISTINCT(genres.name), genres.cached_slug').joins(:user) 

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

Update

Это зависит от версии Postgresql вы используете. Использование версий < 8.4, GROUP BY выполняется быстрее. С версией 8.4 и выше они одинаковы.

+0

Очистить его больше: Genre.select ('DISTINCT (genres.name), жанры. *'). Joins (: user) –

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