2

PostgresのRails3.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

誰かがクエリを修正してユーザーのタグを数えるのを手伝ってくれるなら、それは最もありがたいことです。ありがとう!

4

1 に答える 1

3

これは、Rails Castで送信したSQLiteが、 postgresの使用中にデータベースとして使用されるためです。したがって、問題は、SQLiteMySQLのようなデータベースでは、Group BY句には含まれていないが、postgresには含まれていないフィールドを追加できることです。

したがって、2つのオプションがあります

  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 に答える