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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

658閲覧

生のSQLを避けるためにrubyのメソッドで表現したい

ItiroWakuda

総合スコア9

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2020/07/13 23:18

編集2020/07/14 02:00

#1. Rubyを使用した表現について

カレンダーアプリで特定のイベントの一週間分の日毎の回数をグラフで表す際のバックエンド側の処理を実装しています。
以下rubyまたはactive recordのメソッドでEventテーブルから特定のiconの条件にマッチするstartの時間を取り出してその数を直近一週間分を日毎にカウントし歯抜け部分には0で埋めるようにするテーブルの作成を考えいています。
具体的には以下のようになります。(startのデータの型はdatetimeとなり,event作成の際に日付を整形しております。)
元のテーブル

目指す結果
イメージ説明

[["07-07", 1], ["07-08", 3], ["07-09", 0], ["07-10", 2], ["07-11", 2], ["07-12", 1], ["07-13", 0]]

みたいな配列でデータが欲しいです。

rubyのメソッドで

@milk = Event.order('start').where(icon: 'milk.png').pluck(:start).group_by { |start| I18n.l(start) } .map do |date,array| [date, array.count] end

と書いて日付範囲の指定なしで該当する日付のカウントをとるところまではできておりますが、日付の連番の仮想テーブルの作成とleft join をruby表現できず、以下の通りsqlを生で書いて対応しております。
解決策が分かる方はよろしくお願いします。
なお、postgereSQLでは以下のように書いてます。

SELECT d.start_date, coalesce(r.count, 0) AS count FROM ( SELECT to_char(s.a, 'MM-DD') AS start_date FROM ( SELECT * FROM generate_series(current_timestamp + '-6 days', current_timestamp, '1 day'::interval) ) AS s(a) ) AS d LEFT JOIN ( SELECT to_char(start,'MM-DD') AS start_date, count(*) FROM events WHERE icon='milk.png' GROUP BY to_char(start,'MM-DD'), icon ) AS r ON d.start_date = r.start_date

2.Rails上でpostgereSQLを使った場合のメソッドの書き方

 実際にrailsに書くと以下のような感じとなりました。
event.rb

private def self.milk_count sql = <<-"EOS" SELECT d.start_date, coalesce(r.count, 0) AS count FROM ( SELECT to_char(s.a, 'MM-DD') AS start_date FROM ( SELECT * FROM generate_series(current_timestamp + '-6 days', current_timestamp, '1 day'::interval) ) AS s(a) ) AS d LEFT JOIN ( SELECT to_char(start,'MM-DD') AS start_date, count(*) FROM events WHERE icon='milk.png' GROUP BY to_char(start,'MM-DD'), icon ) AS r ON d.start_date = r.start_date EOS ActiveRecord::Base.connection.select_all(sql) end

events_controller.rb

def statics result = Event.milk_count @milk_count = result::rows end

一応配列は取れるのですが、これが正しいやり方なのかわかりません。おかしい点がありましたらご指摘お願いします。

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

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

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

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

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

asm

2020/07/14 00:18 編集

startとcreated_atで表記方法が違うのが気になりますが もしかしてstartって文字列で持っているのでしょうか? datetimeまたはdateで持っておけばwhere(start: 1.week.ago.beginning_of_day..)で解決すると思うのですが
ItiroWakuda

2020/07/14 01:48

ご回答ありがとうございます。 datetimeで持ってます。カレンダーアプリを作るときにmoment.jsを使ってる関係でそのようになっています。 一週間分の範囲指定に関しては、そちらで解決しそうですね。 データがない13,14日などに0が追加されるようにしたいのですが、そちらは、rubyの方ではどうでしょうか?
ItiroWakuda

2020/07/14 02:01

すいません。event作成の際に %Y-%m-%dT%H:%M:%S'の形式で整形してます。 カレンダーアプリのeventの開始時間を意味してます。
guest

回答1

0

Event#start だけで集約するとこんな感じでしょうか?

ruby

1Event.group('DATE(start)').count

https://qiita.com/Ushinji/items/201c6f8ee83516acd71c を参考にしました

投稿2020/07/15 05:38

aa37971

総合スコア24

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

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

ItiroWakuda

2020/07/15 06:39

ご回答ありがとうございます。 数が0で行がない日付に対して日付:0の行を作りたいのですが、そちらは、sqlじゃないと難しいですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問