【发布时间】:2010-11-24 13:56:30
【问题描述】:
我的应用中有以下模型(仅显示相关范围):
class Audition < ActiveRecord::Base
def self.with_new_applications
columns = self.column_names.map{|c| "auditions.#{c}" }.join(', ')
select(columns).joins(:applications).merge(Application.unreplied).group(columns)
end
end
class Application < ActiveRecord::Base
def self.unreplied
columns = Application.column_names.map{|c| "applications.#{c}" }.join(', ')
select("#{columns}, count(messages.id) as message_count").
joins('left outer join messages on messages.application_id = applications.id').
group(columns).
having('count(messages.id) = 0')
end
end
由于使用 postgreSQL,与 MySQL 相比,由于需要包含计数列/分组的所有列,因此查询似乎变得不必要地复杂。
我错过了什么吗?对我来说,它似乎不太“像 Rails”。
能否以更简单的方式执行这些查询?
谢谢
【问题讨论】:
-
为什么你认为 PostgreSQL 中的查询比 MySQL 中的更复杂? ANSI-SQL 是 ANSI-SQL,对于简单的 COUNT 而言,在两个数据库中的工作方式相同
-
@Frank Heikens:我认为他的意思是在 MySQL 中,您可以使用带有 GROUP BY 的隐藏列:dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html 但在 PostgreSQL 中,您必须列出所有列,否则以另一种方式编写查询.
-
差不多就是这样,使用 PostgreSQL 时你不得不在每个查询中手动输入列,这似乎很奇怪。也许我刚刚被 ActiveRecord/ARel 魔法宠坏了,所以当看似简单的任务变得更加复杂时,它会显得很奇怪。撇开这些不谈,在 Rails 方面,我可以做些什么不同的事情来获得更优雅的解决方案吗?
-
这与(几乎)所有其他品牌的数据库相同,MySQL 是个例外。 PostgreSQL 9.1 版(2011 年发布)将对 GROUP BY 的主键有功能依赖。这将解决您的问题,但您必须等待...depesz.com/index.php/2010/08/08/…
-
您可能想阅读这篇文章,了解从 GROUP BY 中省略列的问题:rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html
标签: ruby-on-rails ruby postgresql named-scope