2011-11-08 9 views
2

私は私の会社のための新しいタイムクロックシステムを構築しています、と私は特定の日にすべてのタイムスタンプ間の時間差を追加する方法を考え出すいくつかの問題を抱えています...時間差

ここ

私の見解は、私が希望私は、毎日の時間を集計できるようにすることです....これを作成し

<% @punches_days.sort.each do |day, punches|%> 

<h3><%= day.strftime('%A %D') %></h3> 
<table> 
    <tr> 

    <th>Status</th> 
    <th>Comment</th> 
    <th>Time</th> 
    <th></th> 
    <th></th> 
    </tr> 

<% for punch in punches %> 
    <tr> 

    <td><%= punch.status %></td> 
    <td><%= punch.comment %></td> 
    <td><%= punch.created_at.in_time_zone(punch.user.time_zone)%></td> 
    <td><%= link_to 'Show', punch %></td> 
    <td><%= link_to 'Edit', edit_punch_path(punch) %></td> 
    <td><%= link_to 'Destroy', punch, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 
</table> 


<% end %> 

...

Sunday 11/06/11 

Status Comment Time   
In  2011-11-06 08:00:00 -0500 Show Edit Destroy 
Lunch  2011-11-06 12:00:00 -0500 Show Edit Destroy 
In  2011-11-06 13:00:00 -0500 Show Edit Destroy 
Out  2011-11-06 16:00:00 -0500 Show Edit Destroy 

Tuesday 11/08/11 

Status Comment Time   
In  2011-11-08 08:00:00 -0500 Show Edit Destroy 
Lunch  2011-11-08 12:15:00 -0500 Show Edit Destroy 
In  2011-11-08 13:00:00 -0500 Show Edit Destroy 
Out  2011-11-08 16:41:00 -0500 Show Edit Destroy 

あり、その後、すべての合計。私は2回の時間差を得る方法を知っていますが、1日中複数の時間の時間差を取り戻すことはできません。

私はインターネットを例に挙げて掃除しました私はここに)

を...任意のアイデアをいただければ幸いです....

おかげで...

EDITを達成しようとしています、と空が出ているの一部と私のコントローラのコードですこのソリューションは実装されていますが、これは私に合計を与えますが、私は順序付きハッシュをどのように使用しているので、毎日これを行うことはできません。 ..

def timecard 
     @punches = Punch.timecard(params[:user]) 
     @punches_days = @punches.group_by { |t| t.created_at.beginning_of_day} 
     @in_out_lengths = @punches.each_slice(2).map { |a| a[1].created_at -   a[0].created_at } 
     @total   = ((@in_out_lengths.inject(:+))/1.hour).round 


    respond_to do |format| 
     format.html # timecard.html.erb 
     format.json { render :json => @punches } 
    end 
    end 
+0

私は少しあなたのデータで混乱しています。日曜日に12:15にパンチした人のように見え、火曜日11:10にパンチアウトしなかったようです。それはかなり長いシフトです。 –

+0

私はそれが笑になるだろうと思うが、これは単なるサンプルデータであり、私はそのようなことを捕まえるための検証を書いていない...ちょうど一緒にナットとボルトを取得しようとしている.... –

+0

したがって、常に[パンチイン、パンチアウト、パンチイン、パンチアウト...]のように見える? –

答えて

3

punches内のオブジェクトの配列を考えると、彼らは、このような何かがあなたの期間を与える最初はパンチ・インとパンチ・アウトである第2のものと対になっていること:

in_out_lengths = punches.each_slice(2).map { |a| a[1].created_at - a[0].created_at } 
total   = in_out_lengths.inject(:+) 

in_out_lengthsアレイは、各パンチイン/パンチアウトペアの時間間隔を持ち、totalは、その日の合計時間になります。あなたは数字のインデックスが醜いと思う場合もfirstlastを使用することができます。

punches.each_slice(2).map { |a| a.last.created_at - a.first.created_at } 

唯一のトリックを所望のペアに一日のイン/アウト配列をチョップするeach_sliceを使用しています。これを実行すると、mapinjectはかなり簡単です。もちろん、これはすべてpunchesが適切に設定され、検証されていることを前提としています。

+0

これは私はかなり近づいています...私は実際に私が注文されたハッシュからそれを取得しているという事実のために私の "パンチの日"にeach_sliceメソッドをcalllingいくつかの問題に遭遇している...私は簡単にこのトーで全体を得ることができますので、私はいくつかの光を見ることができます..私はあなたの配列がどのように配置されているか見ることができるように私の上にコントローラのsrcを追加しています.... –

+0

@チェイス:それで、申し訳ありません、私はここで一日をスタートしています。 –

+0

私はそれをすべて並べ替えることから方法がありますが、これは私に実行されている...今はいくつかの検証とリファクタリングを書く必要があります...ありがとう、この小さな努力からトンを学んだ! –