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

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

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

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

Q&A

解決済

2回答

1010閲覧

nilを含む、条件に合ったデータの件数の取得

Gr.

総合スコア89

Ruby on Rails

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

0グッド

0クリップ

投稿2019/06/30 23:31

Bookモデル

idtitleyear
1aaa2000
2bbb2001
3ccc2002
4ddd2000
5eee2004
6fff2004

出版年(year)が2000年~2004年までの本のデータがあります(ただし、2003年だけは1件もデータがないものとする)。
出版年ごとに何冊のデータがあるかを見たいとき、どのように記述すればよいでしょうか。
具体的には、以下のような配列を取得したいです。

["2000", 2] ["2001", 1] ["2002", 1] ["2003", 0] ["2004", 2]

controller

1@year_count = Book.group(:year).count

view

1<%= @year_count %>

["2000", 2] ["2001", 1] ["2002", 1] ["2004", 2]

このように、出版年でGroupingしてcountする方法だと、データのない出版年(2003年)が0件だという結果が返ってきません。0件の場合0だと返したいです。

以下ように ["2003", 0] も出すにはどう書けばよいでしょうか。

["2000", 2] ["2001", 1] ["2002", 1] ["2003", 0] ["2004", 2]

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

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

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

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

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

guest

回答2

0

ベストアンサー

DBへの問い合わせだけでは無い年のデータを数えるのはできないかと思います。
Bookと関わりのあるtableで2000~2004年が揃っているものがあればそれとのjoinでどうにかなるかもしれませんが。
無い年はゼロを返すというのだと、2999年 0 と100年分出て来ても困るかと。

いつからいつまで、とわかっているなら以下で変換
@year_count =
(2000..2004).map{|year| [year,@year_count[year]||0]}

抜けている所を埋めたいのなら、2000,2004に代えて @year_count から値を持ってくる。

何年を問い合わわせるかわからないなら maisumakunさんのご提案のHashを使うか @year_count[year] || 0 とする

投稿2019/07/01 23:46

winterboum

総合スコア23329

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

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

Gr.

2019/07/03 00:33

winterboumさん 回答ありがとうございます。 いつからいつまでとわかっている状況で、抜けているyearを埋めたいです。 たとえば質問文の例で言うと、値の入っていない2003年に対して @year_count から値(0)を持ってくるには具体的にどう書けばよいのでしょうか?
winterboum

2019/07/03 02:02

@year_count = (2000..2004).map{|year| [year,@year_count[year]||0]}
guest

0

配列でなくていいのなら、こんな方法はどうでしょうか。

ruby

1arr = Book.group(:year).count 2@year_count = Hash.new(0).merge(arr.to_h) 3 4@year.count['2003'] # => デフォルト値の0が返ってくる

投稿2019/07/01 00:10

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問