Tags
私のレールアプリケーションには、をPosts
使用してリンクされているのリストがありますTaggings
。一部のビューでは、最も一般的に使用されている 5 つのタグのリストと、それらがタグ付けされた回数を表示したいと考えています。完全な例を作成するには、3 つの投稿があるテーブルを想定します。
POSTS
ID | title
1 | Lorem
2 | Ipsum
3 | Dolor
2 つのタグを持つテーブル
TAGS
ID | name
1 | Tag1
2 | Tag2
ここで、投稿 1 に Tag1 がタグ付けされ、投稿 2 にタグ 1 と 2 がタグ付けされている場合、タグ付けテーブルは次のようになります。
TAGGINGS
tag_id | post_id
1 | 1
1 | 2
2 | 2
問題は、次の結果を表示するために必要な情報を取得する方法です (できれば DB に何度も戻ることなく)。
Commonly used tags:
tag1 (2 times)
tag2 (1 time)
tag_id
タグを含め、グループ化してカウントで並べ替えることで、MySQL を使用してこれを行うことができました。
ルビー:
taggings = Tagging.select("*, count(tag_id) AS count").includes(:tag).group(:tag_id).order('count(*) DESC').limit(5)
taggings.each { |t| puts "#{t.tag.name} (#{t.count})" }
ただし、アプリを Heroku に移行するため、PostgreSQL 9.1 に移行する必要があります。残念ながら、Postgres の厳密さは、すべてのフィールドgroup by
を句で指定する必要があるため、そのクエリを破ります。私はそのようにしようとしましたがt.count
、行の数を取得するためにもう使用できないという結果になりました。
それで、最終的に質問に行きます:
postgres (v9.1) からこの種の情報を照会してユーザーに表示する最良の方法は何ですか?