質問: Railsでactiverecordから出力する順番を変える方法を悩んでいます。 下記のように 親テーブル-post 子テーブル-likeは関連付けの関係にあります。 ``` #app/models/post.rb class Post has_many :likes end #app/models/like.rb class Like belongs_to :Post end ``` やりたいことは昨日作られたlikeが多い順にPostを並び替えるということをやりたいのですが、 やり方がわかりません。 単純にlikeが多い順にpostを並び変えるということは下記のようにできました。 ``` Post.joins(:likes).group('posts.id').order('COUNT(likes.id) DESC').limit(100) ``` これに昨日作られたlikeで並び替えるにはどのように変更したらよいでしょうか。 よろしくお願いいたします。
回答: 「昨日作られたlikeで並び替える」のであれば、こんなコードはどうでしょうか? ``` Post. joins(:likes). group('posts.id'). order("SUM(CASE WHEN likes.created_at BETWEEN '2015-04-07 00:00:00' AND '2015-04-07 23:59:59' THEN 1 ELSE 0 END) DESC"). limit(100) ``` where句ではないので、おそらく日付の文字列は直接文字列として埋め込む必要があると思います。(もしくはDB上のシステム日付とDB関数をあれこれ駆使して「昨日の開始日時と終了日時」を作り出すとか) エラーが出たり思ったような結果が得られなかったりする場合はアプリで使っているRDBMSを教えてください。 追伸 上のコードでは日時を文字列として渡していますが、そもそもタイムゾーンをきちんと考慮しないと意図した期間を指定できません。 また、タイムゾーンはRails、OS、DBの設定に依存するため画一的な回答を書くことはできません。 詳しくはこちらの記事を参考にしてみてください。 * *