次のような非常に標準的なアーカイブ情報を含むブログのサイドバーを作成しようとしています:
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ですか?結果のグループを時系列で逆順に並べますか?
ご協力いただきありがとうございます。