どなたか上記プログラムの不備点について指摘頂けないでしょうか?
とあるので、まずは今のコードが動かない原因から。
大きく分けて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_month
や all_day
は Rails の拡張です。
色々なメソッドを組み合わせていますが、各メソッドの動作を理解すれば、ロジック自体はさほど難しくないはずです。
言うまでもないかもしれませんが、単にコピペするのではなく、ちゃんと理解した上で使ってくださいね。