验证开始和结束日期时间

时间:2014-08-11 05:55:56

标签: ruby-on-rails

我在Rails 4.1中构建了一个示例事件票务应用程序。我有一个票证模型,用于检查开始和结束日期,并将预订状态设置为打开或关闭。这是代码:

class Ticket < ActiveRecord::Base
  belongs_to :event
  has_many :bookings
  belongs_to :user

  validates :ticket_name, :terms_conditions, presence: true
  validates_date :booking_start_date, on: :create, on_or_after: :today
  validates_date :booking_end_date, after: :booking_start_date
  validates :ticket_price, presence: true, numericality: true
  validates :ticket_quantity, :minimum_quantity, :maximum_quantity, presence: true, numericality: { only_integer: true }

  before_create :check_start_date
  before_update :check_start_date


    def check_start_date
        if (self.booking_start_date >= DateTime.now) 
            self.status = 'Open'
        elsif (self.booking_end_date == DateTime.now) && (ticket_quantity.to_i == 0)
            self.status = 'Closed'
        end
    end

    def maximum_tickets_allowed
        (1..maximum_quantity.to_i).to_a
    end

end

如果开始日期和时间等于当前日期时间,则check_start_date方法不会将状态设置为打开。但是,如果我将开始日期和时间提前一分钟,则状态将设置为打开。我在这里使用错误的比较器吗?

其次,我想知道如何检查日期时间并设置状态以打开或关闭。例如,今天是8月11日,预订将于8月13日开始。现在,我将如何在该日期自动打开预订(意思是,将状态更改为&#34;打开&#34;并取消隐藏“立即购买”按钮)?我是否需要设置一个cron工作或者有另一种方式吗?

2 个答案:

答案 0 :(得分:2)

<强>方法一:

我建议你摆脱check_start_date,并使用状态方法代替status属性 如果没有状态属性,则无需维护状态数据 使用状态方法,您可以始终根据系统时间和故障单的booking_start_date和booking_end_date实时获取正确的状态。

状态方法:

class Ticket < ActiveRecord::Base
  def status
    if self.booking_start_date >= Time.now && Time.now < self.booking_end_date
       && self.ticket_quantity.to_i > 0
       return 'Open'
    else
       return 'Closed'
    end
  end
end

<强>方法2:

首先删除check_start_date和status属性。在控制器代码中,您可以通过sql表达式获取票证状态。如果您有许多应用程序服务器,并且所有服务器之间没有时间同步器,则此方法更好。

class TicketController< ApplicationController
  def show
    @ticket = Ticket.select("tickets.*, case when booking_start_date >= [current date] \
       and booking_end_date <= [current date] and ticket_quantity>0 then 'Open' \
       else 'Closed' end as status").find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @database }
    end
  end
end

注意:您应该使用DBMS的当前日期函数来替换[当前日期]。

答案 1 :(得分:1)

首先check_start_date的逻辑错误

它应该是:

def check_start_date
    if(self.booking_start_date >= DateTime.now && DataTime.now < self.booking_end_date)
        if(self.ticket_quantity.to_i > 0) then  
          self.status = 'Open'
        else
          self.status = 'Sold Out'
        end
    elsif(DateTime.now < self.booking_start_date)
        self.status = 'Booking Available soon'

    elsif(DateTime.now >= self.booking_end_date)
        self.status = 'Closed'
    end
end

您还需要创建一个后台cron作业以继续检查预订状态。