2011-01-03 10 views
0

LoggedTimesがたくさんあるTaskがあります。私は任意の日にタスクに対してログに記録された時間の8時間の制限を入れたい。その人の最新のログ記録された時間が「制限を超えて合計を取るかどうか」を1日分確認することができるようにするには、これを行う最善の方法は何ですか?私が始めていますのはここRailsで関連するモデル検証と設計のいくつかの質問

だ(Task.rb):

validate :max_logged_daily_time 

def max_logged_daily_time 
    if (params[:session_time] + (logged_times.where(:created_at => Date.today).to_a.sum(&:session_time)/60)) > 8 
     errors.add_to_base("Can't have more than 8 hours logged a day") 
     logged_time.errors.add('session_time', 'Logged times exceeded today') 
    end 
    end 

現在、この検証ではなく、以前のログに記録された回の一回8時間は単に休息に追加登録されている別のLoggedTimeを追加する(動作していませんエラーが発生していないので、私は問題を解決するために苦労していますが、これはパラメータの処理と関係していますか?

ユーザーが8時間からそれらのログに記録した総時間を差し引くだけで済むようにビューを修正することができますY;しかし、これは厄介な解決策であり、モデルのバリデーションを維持するという原則に反しているようです。 (そして、私はこのモデルバリデーションの問題を解決するのに役立ちません)。

こちらのアドバイスはありますか?

TIA

答えて

1
class Task < ActiveRecord::Base 
    has_many :logged_times 

    def hours_today 
    LoggedTime.daily_hours_by_task(self).to_a.sum(&:session_time) 
    end 

end 

class LoggedTime < ActiveRecord::Base 
    belongs_to :task 

    scope :daily_hours_by_task, lambda { |task| task.\ 
    logged_times.\ 
    where('logged_times.created_at >= ? AND logged_times.created_at < ?', 
      Date.today, Date.today + 1) } 

    validate :max_logged_daily_time 

    private 

    def max_logged_daily_time 
    if task && ((task.hours_today + session_time)/60.0) > 8 
     errors.add('session_time', 'Logged times exceeded today') 
    end 
    end 

end 

いくつかの注意:あなたが検証にも を防ぐ開始の両方をテストし、その日の

  • を終了する 必要がありますので、

    • created_atは、DateTimeのですそれ自身が最大値を超える単一のLoggedTimeの追加。 floatに変換するには .0を追加 - 整数の切り捨てと によって

    • ディングは、間違った結果が得られます。あなたは タスクモデルでvalidates_associatedを追加 する場合がありますので

    • これは、LoggedTime、 ないタスクを検証します。タスク

    EDIT

    まあnilのとき、検証がバイパスされ

  • は、hours_todayは本当にminutes_todayと呼ばれる必要がありますが、あなたのアイデアを得ます。

  • +0

    ここのコンセプトのいくつかは私にとって新しいものです(noob)ので、私はそれらを選択し、消化して動作するかどうかを確認する必要があります:)歓声 –

    +0

    こんにちは再びzetetic。私はちょうど私がタスクモデルを介して検証しない理由を尋ねて、validates_associated?言い換えれば、LoggedTimeのスコープメソッドの美徳は、Taskモデルの検証と比べて何ですか?デフtotal_hrs_for_date(日= Date.today) practices.where( '??のcreated_at> = ANDのcreated_at <'、日付、日付+ 1).to_a.sum(&:session_time)/60.0 終了 デフ 練習をhours_today .daily_hours_by_activity(self).to_a.sum(&:session_time) end –

    +0

    argh。どのように私はコードでコメントをフォーマットするのですか? ;) –

    1

    私は、特定の日の時間の合計を取得するための別の方法を作成します。

    def total_hrs_logged_for_date(date) 
        #some code 
    end 
    

    このメソッドが動作するかどうかをテストします。

    現在のログに記録された時間を計算する場合も同じです。

    そのように、このライン

    if (params[:session_time] + (logged_times.where(:created_at => Date.today).to_a.sum(&:session_time)/60)) > 8 
    

    が、それはあなたがこれらのISNのどの」を絞り込むのに役立ちますせめて

    if total_hrs_logged_for_date(Date.today) + current_time_being_logged > 8 
    

    なっカスタムバリデータ

    でこれらのものを2を使用します働いている。

    は、私はまた、あなたが持っていることに気づく「のparamsを[:session_time]」

    私は、これはモデルのように聞こえるTask.rbであると思います。おそらくあなたが望むのはちょうど "session_time"です。

    +0

    アドバイスありがとうございます。 LoggedTimeのメソッドであるsession_timeを呼び出すことができるかどうかは疑問に思っています...まだ保存されていないので(まだ検証されていません)、ビューからそのデータにアクセスするにはどうすればよいですか?アドバイスをいただきありがとうございます。 –

    0

    私はそれがそのまま動作することができなかったので、私は少しゼテティックの応答を修正しました。

    class Task < ActiveRecord::Base 
        has_many :logged_times 
        validates_associated :logged_times 
    
        def minutes_today 
        logged_times.where('created_at >= ? AND created_at < ?', Date.today, Date.today + 1) 
        end 
    
    end 
    

    をしてLoggedTimeモデル:最後に

    が、これは働いていた

    class LoggedTime < ActiveRecord::Base 
        belongs_to :task 
    
        validate :max_logged_daily_time 
    
        private 
    
        def max_logged_daily_time 
        if task && ((task.minutes_today + session_time)/60.0) > 8 
         errors.add('session_time', 'Logged times exceeded today') 
        end 
        end 
    
    end 
    

    スコープ方式がbaulkedなぜ私はわからないんだけど、それはやりました。すべてのヒントZetetic?

    関連する問題