19

私は Ruby 1.9.2、Rails 3.0.x を使用しており、MySQL DB を使用しています。毎日新しいメッセージを投稿できるメッセージモデルがあります。

これらのメッセージを月と年の両方でグループ化して表示するインデックス アクションがあります。これは基本的にメッセージをフィルタリングするために使用されます。

私のクエリは次のようになります:-

@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC')

この投稿を参照した後、Rails で group_by 関数を使用しました。

私のGroup Byクエリは次のとおりです:-

@msgs_by_month = @active_msgs.all.group_by {|u| u.created_at.month }

@msgs_by_month というハッシュが返されました。これはメッセージを月ごとにグループ化するのに役立ちましたが、2011 年 9 月と 2012 年 9 月などを区別するのに役立つため、一意のキーを形成するために年を考慮する必要があります。

現在のキーは Hash[Month] 型のみです (例: Hash[9] => 9 月の場合、すべての適切な値を表示できます)。月と年のタイプの一意のキーを取得するにはどうすればよいですか。これを簡単にループして、作成の月と年でグループ化されたすべてのレコードを表示できます。

ありがとうございました

編集:-

これを行う 1 つの方法は、こちらcreated_at.to_dateで提供されている APIを使用することだと思います 。group_by function で機能する一意の月と年の組み合わせキーを取得するために、日をどのように取り除くことができるのだろうか。created_at.to_date

4

5 に答える 5

37

SQL では:

select * from messages group by year(created_at), month(created_at);

レールでは:

Message.all.group_by { |m| m.created_at.beginning_of_month }
于 2012-09-21T07:54:27.407 に答える
3

グループ日付を使用します。

タイムゾーンをサポートしているため、必要に応じてコードを簡単に進化させることができます。

https://github.com/ankane/groupdate

于 2015-02-04T19:56:57.050 に答える
3
Message.select("date_trunc('month', created_at) as month").group("month")
于 2016-06-23T08:16:55.297 に答える