

Railsでactiverecordから出力する順番を変える方法を悩んでいます。

下記のように  
親テーブル-post  
子テーブル-likeは関連付けの関係にあります。

[code]

    #app/models/post.rb
    class Post
     has_many :likes
    end
    
    #app/models/like.rb
    class Like
     belongs_to :Post
    end
    
[/code]

やりたいことは昨日作られたlikeが多い順にPostを並び替えるということをやりたいのですが、  
やり方がわかりません。

単純にlikeが多い順にpostを並び変えるということは下記のようにできました。

[code]

    Post.joins(:likes).group('posts.id').order('COUNT(likes.id) DESC').limit(100)
    
[/code]

これに昨日作られたlikeで並び替えるにはどのように変更したらよいでしょうか。

よろしくお願いいたします。


CC BY-SA 3.0
2015-04-06T14:46:01.940
8834
2015-04-07T10:54:26.750
5891
question
ruby-on-rails rails-activerecord
【Rails】親テーブルのデータを子テーブルの検索したデータの個数で並び替える方法


「昨日作られたlikeで並び替える」のであれば、こんなコードはどうでしょうか？

[code]

    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)
    
[/code]

where句ではないので、おそらく日付の文字列は直接文字列として埋め込む必要があると思います。（もしくはDB上のシステム日付とDB関数をあれこれ駆使して「昨日の開始日時と終了日時」を作り出すとか）  
エラーが出たり思ったような結果が得られなかったりする場合はアプリで使っているRDBMSを教えてください。

## 追伸

上のコードでは日時を文字列として渡していますが、そもそもタイムゾーンをきちんと考慮しないと意図した期間を指定できません。  
また、タイムゾーンはRails、OS、DBの設定に依存するため画一的な回答を書くことはできません。  
詳しくはこちらの記事を参考にしてみてください。

  * <http://qiita.com/joker1007/items/2c277cca5bd50e4cce5e>
  * <http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c>


CC BY-SA 3.0
2015-04-07T10:00:50.897
8867
2015-04-07T10:54:26.750
2015-04-07T10:54:26.750
85
85
8834
answer