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

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

ただいまの
回答率

90.45%

  • Ruby on Rails

    9109questions

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

  • jQuery

    8385questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • jQuery UI

    190questions

    jQuery UI はjQuery公式のインターフェースライブラリであり、対話型のウェブアプリケーションを作る際に役立ちます。

勤怠管理サービスの設計について

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,130

Yuinyan

score 277

 前提・実現したいこと

勤怠管理サービスを開発しています。
具体的には、スマホで都度位置情報と業務内容と時刻を示したデータを一定間隔でRails側に送信し、集計するというようなものです。

1 位置情報 接客 14:00
2 位置情報 移動 14:15
3 位置情報 移動 14:30
4 位置情報 移動 14:40
5 位置情報 移動 14:50
6 位置情報 接客 15:00
7 位置情報 移動 16:00
8 位置情報 事務作業 16:45
9 位置情報 完了 17:30

このようなデータが取得できているのですが、ここから、業務内容ごとに集計をしてグラフとして出したいと考えております。

接客  合計:75分
移動  合計:90分
事務作業 合計:45分

総業務時間 3時間30分 (210分)

と、人間の目には普通に計算できるのですが、rails(ruby)で、はどのようにコードとしてかけますでしょうか。

私がイメージしている実装は、こんな感じなのかと思うのですが、何かもっと良い方法がありますか?それと、次の要素はどのように指定できるのでしょうか。

work_datas.each do |work_data|
 if work_data.type == "接客"
   配列に入れておく? 
  次の要素.current_at - work_data.current_at
 else
       .
       .
       .
 end
end

 モデル

LocationLog 位置および業務内容のモデル
# == Schema Information
#
# Table name: location_logs
#
#  id                :integer          not null, primary key
#  user_id           :integer          not null
#  work_category_id  :integer          not null
#  item_id           :integer
#  latitude          :float            not null
#  longitude         :float            not null
#  current_at        :datetime
#  created_at        :datetime         not null
#  updated_at        :datetime         not null
# Table name: work_categories
#
#  id         :integer          not null, primary key
#  name       :string           not null
#  created_at :datetime         not null
#  updated_at :datetime         not null

# Seedで作成している
# WorkCategory.create(id: 100, name:"その他")
# WorkCategory.create(id: 1, name:"移動")
# WorkCategory.create(id: 2, name:"休憩")
# WorkCategory.create(id: 3, name:"接客")
# WorkCategory.create(id: 4, name:"待機")
# WorkCategory.create(id: 5, name:"完了")

以下は今回作ったモデルです。上記の情報を収集して格納したいと考えているものです。

 集計結果を入れる予定のモデル(daily_reports)
# Table name: daily_reports
#
#  id                        :integer          not null, primary key
#  item_count                :string
#  total_distance            :string
#  total_business_time       :string
#  total_moving_time         :string
#  total_breaking_time       :string
#  total_working_time        :string
#  total_waiting_time        :string
#  total_other_time          :string
#  created_at                :datetime         not null
#  updated_at                :datetime         not null


他にもモデルはたくさんありますが、関係するモデルを記しました。また、とりあえず作ったのでstringなど最終的にintegerにすべき部分もありそうですが取り急ぎ。

最終的には、sidekiq& wheneverを使って、翌日にBatch処理して、データを保存できたらと思っています。(そのためのWorkerはすでに出来ています。)

データベースは、postgresqlを利用しています。

 補足情報(FW/ツールのバージョンなど)

rails5
jQuery

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

データベースの存在が質問文には見えませんが、MySQL等のデータベースを使えば実現できるのではないでしょうか。

イメージとしてはこんな感じになるかと思います。

<データ保存部分>
アプリからRailsにデータを送信

Railsでは受信したデータをデータベースに保存

<データ表示部分>
RailsでSQL(RailsであればActiveRecord?)経由でデータベースからデータを取得し、画面生成。(グラフ等はjQueryを活用)

コードにフォーカスする前段階として、どのようなアーキテクチャにするのかという全体感をまずは考えたほうがいいのでは無いかと。(既にそのあたりも考えておられたのであれば、それも質問文に盛り込んでいただけるとベターです)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 15:44

    すみません。PostgreSQLを利用しています。データはモデルから引っ張ってこれるのですが、実際のコードが私のイメージ通りにいくのかが心配です。

    キャンセル

  • 2018/03/16 15:55

    1 位置情報 接客 14:00
    2 位置情報 移動 14:15
    3 位置情報 移動 14:30
    4 位置情報 移動 14:40
    5 位置情報 移動 14:50
    6 位置情報 接客 15:00
    7 位置情報 移動 16:00
    8 位置情報 事務作業 16:45
    9 位置情報 完了 17:30

    キャンセル

  • 2018/03/16 15:56

    このようなデータから

    接客  合計:75分
    移動  合計:90分
    事務作業 合計:45分

    総業務時間 3時間30分 (210分)

    このような結果を出すにはどのようなコードをかけばだせるか、、ということを知りたいと思っています。

    キャンセル

  • 2018/03/16 15:58

    了解です。データベースやモデル周りの情報をぜひ質問文に追記いただけると助かります。

    キャンセル

  • 2018/03/16 21:17

    追記しました。よろしくお願いいたします。

    キャンセル

  • 2018/03/16 21:18

    しかし、嫌な勤怠管理やなー。。

    キャンセル

  • 2018/03/16 21:38

    たしかに、、、

    キャンセル

  • 2018/03/16 22:47

    困っているから質問をしているのですが、、。言われた通りに情報を追記したのに、、、何なのでしょうか。。。

    キャンセル

  • 2018/03/17 12:37

    スマホで勤怠管理されてしまう点に引っかかりコメントしました。ただその是非はここでは関係無いようなので、失礼しました。

    きちんと本題に回答すると、

    1 位置情報 接客 14:00
    2 位置情報 移動 14:15
    3 位置情報 移動 14:30
    4 位置情報 移動 14:40
    5 位置情報 移動 14:50
    6 位置情報 接客 15:00
    7 位置情報 移動 16:00
    8 位置情報 事務作業 16:45
    9 位置情報 完了 17:30

    から、

    接客 0:15
    移動 0:15
    移動 0:10
    移動 0:10
    移動 0:10
    接客 1:00
    移動 0:45
    事務作業 0:45

    のかたちに変換できれば、後はカテゴリ毎に集計できると思います。

    いただいたコードではカテゴリ全てに対してif文を書いていますが、カテゴリが完了かそうでないかのif文だけで書けるように思います。

    取り急ぎ考え方を回答させていただきます。

    キャンセル

+1

手作業で計算できる、というのなら、その手作業のプロセスをコードに落とせばいい、ということになります
まーはやいはなしが、業務の項目が変化した時点の時刻から、各業務の時間を積算していくということになります

んで、ここはあくまで質問に回答するところですので、プログラミングのヒントを出すことはできますが、具体的なコードを出すことはできません。
それはあなたが組むか、プログラマに依頼して作ってもらってください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 23:14

    念のためですが具体的なコードは求めていませんよ。より良いやり方がないか質問させてもらっただけでした。

    キャンセル

  • 2018/03/16 23:15

    ならよろしい。それではこちらの回答に感謝してください。

    キャンセル

  • 2018/03/16 23:16

    いやー、それは勘弁。こちらは、不愉快につき通報させてもらいますよ。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby on Rails

    9109questions

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

  • jQuery

    8385questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • jQuery UI

    190questions

    jQuery UI はjQuery公式のインターフェースライブラリであり、対話型のウェブアプリケーションを作る際に役立ちます。