Как получить активные жанры в activerecord? - PullRequest
0 голосов
/ 03 января 2011

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

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

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

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)

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

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 Ответ

1 голос
/ 03 января 2011

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

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

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

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

Обновление

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...