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

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

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

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

Q&A

解決済

1回答

979閲覧

特定のカラムからデータを取得し、ビューに反映させたい。

sheep1991

総合スコア2

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/02 02:33

前提・実現したいこと

Ruby on rails学習の一貫として勤怠管理アプリを作成しています。
出勤ボタンと退勤ボタンを押したらそれぞれ押した時点の時刻が記録されるようになっています。
現状、出勤時間は出勤簿(view)に反映されているのですが、退勤時間の反映のさせ方がわからず詰まっております。

該当のソースコード

worktimes_controller.rb

Ruby

1def create 2 require 'date' 3 @time_card = Timecard.new(timecard_params) 4 case params[:commit] 5 when "出勤" ; @time_card.start_time = Time.now 6 when "退勤" ; @time_card.end_time = Time.now 7 end 8 @time_card.save 9 end 10 11 def show 12 @day = Date.today 13 start_date = Date::new(@day.year,@day.month, 1) 14 end_date = start_date >> 1 15 end_date = end_date - 1 16 @start_date = start_date 17 @end_date = end_date 18 year_name = start_date.year 19 @year_name = year_name 20 month_name = start_date.month 21 @month_name = month_name 22 #下記のコードで一月分のデータのみを取得 23 @time_card = Timecard.where(created_at: Time.now.beginning_of_month..Time.now.end_of_month, user_id: current_user.id) 24 end 25 26 private 27 def timecard_params 28 params.permit(:start_time, :end_time, :total_time, :lost_time).merge(user_id: current_user.id) 29 end

show.html.haml

Ruby

1.wrapper 2 = render partial: 'worktimes/side_bar' 3 .table-contents 4 %h1 #{@year_name}年#{@month_name}月の出勤簿 5 %table{:align => "center"} 6 %thead 7 %tr 8 %th 日付 9 %th 曜 10 %th 出社時間 11 %th 退社時間 12 %th 勤務時間 13 %th 残業時間 14 - 15 - (Date.parse("#{@start_date}")..Date.parse("#{@end_date}")).each do |date| 16 %tr 17 %td= "#{date.month}#{date.day}日" 18 %td= %w[日 月 火 水 木 金 土][date.wday] 19 #下記のコードで日付が一致する記録時間をデータベースから取得。 20 -timecard = @time_card.find_by(created_at: date.beginning_of_day..date.end_of_day) 21      #下記のコードで退勤時間を取得できるようにしたいが上手くいっていない。 22 -timecard1 = @time_card.where(created_at: date.beginning_of_day..date.end_of_day) 23 -if timecard && timecard1 24 %td= timecard.start_time.try(:strftime,"%H:%M:%S") 25 %td= timecard1.end_time.try(:strftime,"%H:%M:%S") 26 %td 27 %td 28 -else 29 %td 30 %td 31 %td 32 %td

20200717055143_create_timecards.rb

Ruby

1class CreateTimecards < ActiveRecord::Migration[6.0] 2 def change 3 create_table :timecards do |t| 4 t.time :start_time 5 t.time :end_time 6 t.time :total_time 7 t.time :lost_time 8 t.references :user, index: true, foreign_key: true 9 t.timestamps 10 end 11 end 12end

現状のsequel pro

試したこと

-timecard = @time_card.find_by(created_at: date.beginning_of_day..date.end_of_day)
-timecard1 = @time_card.where(created_at: date.beginning_of_day..date.end_of_day)

find_byを使うと最初に一致したデータを取得してくるため、上のコードだと現状のデータベースからstart_timeカラムのみが取得されてきてしまうので、下のコードを作成し、find_byではなくwhereメソッドの使用すると、%td= timecard1.end_time.try(:strftime,"%H:%M:%S")のコードのend_timeがundefined methodになってしまったり、また現在のデータベース上、end_timeカラムに記録されたデータが最新のデータになるので、下記記事を参考にorderメソッドなどを使用したりしてみたのですが、上手くいきませんでした。
この点についてアドバイスを頂けますと幸いです。よろしくお願い致します。

参考記事
「railsのActiveRecordで最新のレコード1件取得する」
https://qiita.com/new1/items/29b3bc0f5babc9c6c7be

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

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

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

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

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

guest

回答1

0

自己解決

すみません。自己解決したので、解決方法を記載しておきます。

Ruby

1-timecard1 = @time_card.where(created_at: date.beginning_of_day..date.end_of_day) 2

上記のコードに

Ruby

1-timecard1 = @time_card.where(created_at: date.beginning_of_day..date.end_of_day).second

secondを加えるだけでした。

最終的に下記のコードになりました。

show.html.haml

Ruby

1wrapper 2 = render partial: 'worktimes/side_bar' 3 .table-contents 4 %h1 #{@year_name}年#{@month_name}月の出勤簿 5 %table{:align => "center"} 6 %thead 7 %tr 8 %th 日付 9 %th 曜 10 %th 出社時間 11 %th 退社時間 12 %th 勤務時間 13 %th 残業時間 14 - 15 - (Date.parse("#{@start_date}")..Date.parse("#{@end_date}")).each do |date| 16 %tr 17 %td= "#{date.month}#{date.day}日" 18 %td= %w[日 月 火 水 木 金 土][date.wday] 19 -timecard = @time_card.where(created_at: date.beginning_of_day..date.end_of_day).first 20 -timecard1 = @time_card.where(created_at: date.beginning_of_day..date.end_of_day).second 21 -if timecard && timecard1 22 %td= timecard.start_time.try(:strftime,"%H:%M:%S") 23 %td= timecard1.end_time.try(:strftime,"%H:%M:%S") 24 %td 25 %td 26 -else 27 %td 28 %td 29 %td 30 %td

投稿2020/09/02 07:35

編集2020/09/03 00:12
sheep1991

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問