ActiveRecord / PostgreSQL - GROUP BY子句或用于聚合函数

时间:2012-10-04 22:40:55

标签: ruby-on-rails-3 postgresql activerecord

我正试图在Postgres上使用我的Rails 3.2应用程序进行标记Railscast。除了标签云功能之外,我还有它的工作原理。但是,我通过查找基于用户创建的标记来形成标记云来添加图层。

我正在尝试调整/修改Railscast中的代码:

def self.tag_counts
  Tag.select("tags.*, count(taggings.tag_id) as count").
    joins(:taggings).group("taggings.tag_id")
end

但是当我运行它时,我得到PG错误:

PG::Error: ERROR:  column "tags.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT tags.*, count(taggings.tag_id) a...

以下是模型的外观:

user.rb

has_many :trades
has_many :taggings, :through => :trades
has_many :tags, :through => :taggings

trade.rb

has_many :taggings
has_many :tags, :through => :taggings

tagging.rb

belongs_to :tag
belongs_to :trade

tag.rb

has_many :taggings
has_many :trades, through: :taggings

如果有人可以帮助修改查询,以便对用户的标签进行计数,这将是最受欢迎的。谢谢!

1 个答案:

答案 0 :(得分:3)

那是因为在你使用 postgres 时,你发送的 SQLite 被用作数据库。所以问题是像 SQLite MySQL 这样的数据库允许你在 Group BY 子句中添加的字段但是 postgres 没有。

所以你有两个选择

  1. 您在标记模型中使用了belongs_to关联中的counter_cache选项。
  2. 使用以下内容替换join。

    Tagging.includes(:tag).select(“taggings.tag_id,count(taggings.tag_id)as count”)。group(“taggings.tag_id”)