前提・実現したいこと
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
試したこと
-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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。