2

使用回数に基づいてタグを選択し、その順序で配置する次のタグメソッドがあります。コードは railscasts のエピソード ( http://railscasts.com/episodes/382-tagging ) に基づいています。

以前は動作していた mysql から、スタック トレースで生成されたエラー メッセージを確認できる postgres に DB を変更しました。

postgresql で動作するようにこの sql をリファクタリングするにはどうすればよいですか?

def tags
   Tag.joins(:taggings).select('tags.*, count(tag_id) as "tag_count"').group(:tag_id).order('tag_count desc')
end

スタックトレース

ActiveRecord::StatementInvalid - PG::GroupingError: ERROR:  column "tags.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT tags.*, count(tag_id) as "tag_count" FROM "tags" INNE...
               ^
: SELECT tags.*, count(tag_id) as "tag_count" FROM "tags" INNER JOIN "taggings" ON "taggings"."tag_id" = "tags"."id" GROUP BY tag_id ORDER BY tag_count desc:

タグ.rb

class Tag < ActiveRecord::Base

  has_many :taggings
  has_many :questions, through: :taggings
  #omitted for brevity

tagging.rb

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :question
end

さらにコードが必要な場合は、ただ叫んでください。

4

2 に答える 2

1

あなたのエラーメッセージは、レールによって構成されたSQLを提供します

SELECT tags.*, count(tag_id) as "tag_count"
FROM "tags"
    INNER JOIN "taggings" ON "taggings"."tag_id" = "tags"."id"
GROUP BY tag_id
ORDER BY tag_count desc

これは MySQL のみの構文であり、MySQL で許可されていることが好きではなかったと言わざるを得ません。含まれていない列をgroup by結果セットに表示する方法が不明です。最小にする必要がありますか?マックスにすべき?

結果に必要な列のみを選択し、使用しないことをお勧めしますselect *。結果にはまったく必要ないように見えますtags.id(すでに持っていてtaggings.tag_id、のために等しいためinner join)。なぜこのエラーが発生するのかを理解し、適切な ANSI 構文で SQL を書き直したほうがよいと思います。次に例を示します。

select tags.name as tag_name, count(*) as "tag_count"
from tags
    inner join taggings on taggings.tag_id = tags.id
group by tags.name
order by tag_count desc
于 2013-08-22T04:51:37.353 に答える
1

エラーメッセージが示すように「tags.id」をグループ句に追加すると、魅力的に機能しました。

Tag.joins(:taggings).select('tags.*, count(tag_id) as "tag_count"').group("tags.id").order('tag_count desc')
于 2013-08-22T01:28:53.493 に答える