我在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工作或者有另一种方式吗?
答案 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作业以继续检查预订状态。