質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

336閲覧

集計したときにデータが存在しない場合は0としたい

Cafemocha

総合スコア37

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2018/11/28 09:21

Railsとポスグレで1日辺りの記事数を表示しようとしています。

ruby

1kikan = "2018-11-1".in_time_zone.all_month 2@entries = Entry.where(created_at: kikan).group("date_trunc('day',entries.created_at)").count(:created_at)

記事がある日はデータが取れるのですが、記事が無い日も記事数0としてデータを取る方法が知りたいです。
ご教示よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

SQLなら DBの関数やサブクエリ等を駆使してできるとは思いますがActiveRecordでやるのは厳しいと思います

記事が無い日も記事数0としてデータを取る

ではなく、記事が無い日を記事数0としてデータを「作る」のはどうでしょう?

ruby

1@full_entries = 2 "2018-11-1".to_date.all_month.map do |date| 3 [date, @entity[date] || 0] 4 end.to_h

投稿2018/11/28 09:46

Ighrs

総合スコア656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cafemocha

2018/11/30 01:29 編集

ご回答、ありがとうございます。 教えていただいたコードを試したところ、下記のエラーが発生してしまいました;; TypeError in EntriesController#report no implicit conversion of Date into Integer データの中身は下記のような形です。 p kikan => Thu, 01 Nov 2018 00:00:00 +0000..Fri, 30 Nov 2018 23:59:59 +0000 p @entries => [[2018-11-01 00:00:00 +0900, 122], [2018-11-03 00:00:00 +0900, 63], [2018-11-06 00:00:00 +0900, 133], [2018-11-08 00:00:00 +0900, 100], [2018-11-10 00:00:00 +0900, 58], [2018-11-13 00:00:00 +0900, 122], [2018-11-15 00:00:00 +0900, 109], [2018-11-17 00:00:00 +0900, 85], [2018-11-20 00:00:00 +0900, 114], [2018-11-22 00:00:00 +0900, 132], [2018-11-24 00:00:00 +0900, 22]]
Ighrs

2018/11/30 02:17

@entries が二重配列なら、ループの中身は一旦 hash にしないと件数が取れないかもしれません # [日付, 件数(なければ0)」というデータを作っている [date, @entities.to_h[date] || 0] 要するに日付を起点にデータを組み立てているだけです
Cafemocha

2018/11/30 03:01 編集

Ighrs様 ご回答ありがとうございます! ハッシュにしたところ、エラーはなくなりましたが、全て0が帰ってきてしまします;; {Thu, 01 Nov 2018=>0, Fri, 02 Nov 2018=>0, Sat, 03 Nov 2018=>0, Sun, 04 Nov 2018=>0, Mon, 05 Nov 2018=>0, Tue, 06 Nov 2018=>0, Wed, 07 Nov 2018=>0, Thu, 08 Nov 2018=>0, Fri, 09 Nov 2018=>0, Sat, 10 Nov 2018=>0, Sun, 11 Nov 2018=>0, Mon, 12 Nov 2018=>0, Tue, 13 Nov 2018=>0, Wed, 14 Nov 2018=>0, Thu, 15 Nov 2018=>0, Fri, 16 Nov 2018=>0, Sat, 17 Nov 2018=>0, Sun, 18 Nov 2018=>0, Mon, 19 Nov 2018=>0, Tue, 20 Nov 2018=>0, Wed, 21 Nov 2018=>0, Thu, 22 Nov 2018=>0, Fri, 23 Nov 2018=>0, Sat, 24 Nov 2018=>0, Sun, 25 Nov 2018=>0, Mon, 26 Nov 2018=>0, Tue, 27 Nov 2018=>0, Wed, 28 Nov 2018=>0, Thu, 29 Nov 2018=>0, Fri, 30 Nov 2018=>0}
Ighrs

2018/11/30 03:07

なら日付のフォーマットが違うのかもしれませんね 以下のように揃えると取得できるかもしれません .group("date_trunc('day',entries.created_at)") ではなく20180909 みないな文字列でグループする [date, @entity[date.strftime('%Y/%m/%d')] || 0] ただ、この辺の調整は明確な一つの解はないので、どんな値が取れているかを確認しながらいろいろ試すと良いと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問