0

モデル (オークション) に 2 つの属性 (時間と日) があります。時間と日の組み合わせに関するビジネス ロジックがあります。例えば

auction duration = days*24 + hours

また、時間と日にいくつかの基本的な検証があります。

class Auction < ActiveRecord::Base
  validates :days,:presence => true, :numericality => { :greater_than_or_equal_to => 0, :only_integer => true }
  validates :hours,:presence => true, :numericality => { :greater_than_or_equal_to => 0, :only_integer => true }

ビジネス ロジックを検証に組み込みたいので、時間と日数の両方をゼロにすることはできません。ActiveRecord 検証でこれを行う方法はありますか? AR検証なしでこれを行う方法が他にもあることは知っています。現在、モデルの新しいインスタンスを作成しています。上記のように曜日と時間を検証します。次に、「手動で」検証を行い、合格しない場合はインスタンスを削除するモデルメソッドがあります。私はこれがこれを行うための最良の方法ではないことを知っています

  def compute_end_time
    # assumes that days and hours are already valid
    time = self.days*24 + self.hours

    if time > 1
      self.end_time =  time.hours.from_now.utc
      self.save

    else
      # Auction duration too short (i.e. zero)
      self.delete
    end
  end
4

3 に答える 3

2

このようなプライベートな検証関数を書く必要があります。

class Auction < ActiveRecord::Base
   validates :days,:presence => true, :numericality => { :greater_than_or_equal_to => 0, :only_integer => true }
   validates :hours,:presence => true, :numericality => { :greater_than_or_equal_to => 0, :only_integer => true }

   validate :days_and_hours

   private

   def days_and_hours
     if !(days && hours)
     errors.add_to_base("Days and hours can not be zero. Thank you.")
   end
 end
end
于 2012-11-07T03:15:01.830 に答える
0

数値バリデーターを使用して、0 より大きい値を確認できます。

validates :auction_duration, :numericality => { :greater_than => 0 }

詳細はこちら: http://guides.rubyonrails.org/active_record_validations_callbacks.html#numericality

于 2012-11-07T03:24:53.893 に答える
0

したがって、私の最終的な解決策は@rharrison33の拡張でした:

  validates :days,:presence => true, :numericality => { :greater_than_or_equal_to => 0, :only_integer => true }
  validates :hours,:presence => true, :numericality => { :greater_than_or_equal_to => 0, :only_integer => true }
  validate :days_and_hours

def days_and_hours
    # It may not validate days and hours separately before validating days_and_hours,
    # so I need to make sure that days and hours are both not NIL before trying to compute 'time'
    # I also only want to compute end_time if it has not been computed yet
    if (!self.days.nil? && !self.hours.nil?)

      if (self.end_time.nil?) # if end_time has not yet been computed

        if (self.days == 0 && self.hours == 0)
          self.errors[:base] << "Days and hours can not be zero."
        else
          time =  self.hours  + self.days*24
          self.end_time = time.minutes.from_now.utc
          self.setStatus # validate status after end time is set
        end
      end
    end
  end
于 2013-02-27T22:13:35.883 に答える