2

我正在尝试在 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...

以下是模型的外观:

用户.rb

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

贸易.rb

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

标记.rb

belongs_to :tag
belongs_to :trade

标签.rb

has_many :taggings
has_many :trades, through: :taggings

如果有人可以帮助修改查询以计算用户的标签,那将不胜感激。谢谢!

4

1 回答 1

3

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

所以你有两个选择

  1. 您在标记模型中的belong_to 关联中使用counter_cache 选项。
  2. 将 join 替换为如下所示。

    tagging.includes(:tag).select("taggings.tag_id, count(taggings.tag_id) as count").group("taggings.tag_id")

于 2012-10-16T21:03:31.057 回答