次のような非常に標準的なアーカイブ情報を含むブログのサイドバーを作成しようとしています:
2013 年 8 月: 3 件の投稿
2013 年 7 月: 5 件の投稿
2013 年 6 月: 4 件の投稿
...等
month
この情報 ( 、year
、count
) を逆時系列でソートした ActiveRecord クエリはどれですか?
Post モデルは非常に単純です -- title
, body
, created_at
,modified_at
列。上記のように、月と年でグループ化された投稿の数を取得する ActiveRecord/Postgres クエリを作成しようとしています。次のクエリは、まさにそれを正常に実行します。
Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month')
しかし、私は明示的に列を時系列で逆にソートしたいと考えています (したがって、2013 年 8 月はリストで 2013 年 7 月よりも上になります)。始めるために、次のクエリを試してみましたが失敗しました。
Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month').order(:year => :desc)
次の SQL が生成されます。
SELECT count(*) as count, extract(year from created_at) as year, extract(month from created_at) as month FROM "posts" GROUP BY year, month ORDER BY "posts"."year" DESC
そして、次のエラー:
PG::UndefinedColumn: ERROR: column posts.year does not exist
を使用してカウントで並べ替えると、クエリは実際に実行されます.order(:count => :desc)
が、実際には期待どおりに並べ替えられていないようです (に切り替えて:asc
も違いはありません)。
私はSOとグーグルを精査しましたが、役に立ちませんでした。並べ替えも試しましたcreated_at
が、エラーがスローされActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "posts.created_at" must appear in the GROUP BY clause or be used in an aggregate function
ます。理想的には、単純なPost.order(:created_at => :desc)
を実行し、適切に並べられた結果に対してグループ化クエリを実行しますが、方法がわかりません。
year
非常に失われました...列と列month
を使用して投稿を取得するにはどうすればよいcount
ですか?結果のグループを時系列で逆順に並べますか?
ご協力いただきありがとうございます。