如何在activerecord中获得活跃的流派?

时间:2011-01-03 18:04:16

标签: ruby-on-rails postgresql activerecord

我正在使用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 个答案:

答案 0 :(得分:1)

DISTINCTGROUP BY通常会生成相同的查询计划,因此两种查询结构的性能应该相同。

由于你没有使用任何聚合函数,你应该使用在你的情况下最有意义的函数,我相信这是一个:

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

在尝试稍后阅读您的代码时会更清楚,并记住您在此处所做的事情,正如您所指出的那样,它不那么混乱。

<强>更新

这取决于您使用的Postgresql的版本。使用版本&lt; 8.4,GROUP BY更快。对于8.4及更高版本,它们是相同的。