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

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

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

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

Ruby

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

Q&A

解決済

1回答

483閲覧

毎週金曜日のクリック数を抽出する方法

KOO_

総合スコア58

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2020/01/27 07:40

現在プログラムでクリックした数に対するanalyticsを構築しております。

その中で『毎週金曜日にアクセスした数』を抽出したいと考えております。

@call_count_month_friday = @call.where('created_at > ?', Time.current.beginning_of_month).where('created_at < ?', Time.current.end_of_day).count and @call.where(created_at: :friday)

上記のようにプログラムしましたが、結果はand @call.where(created_at: :friday)
を抜いた時と特に変わらず、金曜日のみのデータは抽出されないようです。

どなたか上記プログラムの不備点について指摘頂けないでしょうか?

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

どなたか上記プログラムの不備点について指摘頂けないでしょうか?

とあるので、まずは今のコードが動かない原因から。
大きく分けて2つの問題があると思います。

■ 問題1: and の使い方がおかしい

今のコードは大体以下のような構造をしています。

@call_count_month_friday = @call.where(...).count and @call.where(...)

このコードを ruby がどう解釈するかというと、、、
まずは下記の部分を実行して count の数を変数に代入します。

@call_count_month_friday = @call.where(...).count

次に、代入結果が nil または false かどうかチェックします。
代入結果が nil または false なら、 and より後ろの処理は行わずに次に進みます。
代入結果が nil でも false でもないなら、 and より後ろの処理を実行します。
どのみち、代入した後に and の後ろを処理するため、 @call.where(created_at: :friday) の部分は変数に何の影響も及ぼしません。

もし複数の where の条件を AND 検索したいなら、以下のようにつなげて書けばOKです。 and は使いません。

@call_count_month_friday = @call.where('created_at > ?', Time.current.beginning_of_month) .where('created_at < ?', Time.current.end_of_day) .where(created_at: :friday) .count

ただし、このコードにもまだ問題が残っています。

■ 問題2: where(created_at: :friday) がおかしい

「作成日が金曜日のもの」が抽出されることを期待して

where(created_at: :friday)

と書かれていると思いますが、残念ながら Rails はこの書き方を理解してくれません。
日付型と "friday" という文字列を比較しようとして、エラーで落ちちゃうはずです。

■ 修正方法

じゃあどうすればいいの?って話をします。

winterboum さんが提示されている過去のQAも非常に有益な情報だと思うのですが、リンク先の回答が sqlite3 専用っぽかったので、DB を問わずに使えるコードを考えてみました。

Rails側で「今月のすべての金曜日」の配列を作って、それを where に渡しています。

rb

1today = Time.zone.today 2#=> 2020-1-30 3 4all_friday = today.all_month.select(&:friday?) 5#=> [2020-1-3, 2020-1-10, 2020-1-17, 2020-1-24, 2020-1-31] 6 7all_friday_all_day = all_friday.map(&:all_day) 8#=> [ 9# 2020-1-3 00:00:00 .. 2020-1-3 23:59:59, 10# 2020-1-10 00:00:00 .. 2020-1-10 23:59:59, 11# 2020-1-17 00:00:00 .. 2020-1-17 23:59:59, 12# 2020-1-24 00:00:00 .. 2020-1-24 23:59:59, 13# 2020-1-31 00:00:00 .. 2020-1-31 23:59:59, 14# ] 15 16@call_count_month_friday = @call.where(created_at: all_friday_all_day).count

all_monthall_day は Rails の拡張です。
色々なメソッドを組み合わせていますが、各メソッドの動作を理解すれば、ロジック自体はさほど難しくないはずです。
言うまでもないかもしれませんが、単にコピペするのではなく、ちゃんと理解した上で使ってくださいね。

投稿2020/01/30 08:39

shinoharat

総合スコア1676

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

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

KOO_

2020/01/31 02:10

とってもご丁寧にありがとう御座います。確かにメソッドを理解してさえいれば難しいものではなかったのですね。ご丁寧に解説いただいたので原因も特定でき、とても勉強になりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問