【发布时间】:2011-01-03 18:04:16
【问题描述】:
我正在使用 Rails 3 和 postgresql。我有以下流派:摇滚、氛围、另类、浩室。
我还注册了两个用户。一个以 rock 和另一个 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
【问题讨论】:
标签: ruby-on-rails postgresql activerecord