[英]How can I implement in Rails bid offers that sellers can cancel or accept within 24hrs or transaction is cancelled?
我正在一个铁路市场上工作,该市场允许买方向卖方提出要约以竞标上市。 卖方可以取消或接受出价,但只有24小时的时间可以这样做,否则出价将过期并且交易将被取消。 用户可以是买家或卖家。
我有一个代表每个交易的订单模型。
Class Order < ActiveRecord::Base
belongs_to :seller, class_name: "User"
belongs_to :buyer, class_name: "User"
belongs_to :listing
end
在我的预订控制器上,类OrdersController <应用程序控制器before_action:authenticate_user!
def create
@order = Order.new(order_params)
@seller = @order.listing.user
@order.buyer_id = current_user.id
@order.seller_id = @seller.id
@bidding_fee = @order.bidding_fee
end
我想区分买方取消和卖方取消,因为如果卖方取消了对清单的投标,则买方不支付任何投标费用,但是如果买方取消了他所作的定单,则要向他收取投标费用。 如何执行投标交易。 最难的部分是弄清楚在rails中创建一个计时器,该计时器将向卖方显示还剩多少时间,例如,在出价到期前12分4小时,如果没有响应,则在24小时后取消出价,尤其要牢记不同的客户端时区与订单的created_at时间可能相隔数小时。 我还需要将订单状态显示为待处理,已取消或已接受,这排除了布尔功能,因为这会创建三种可能的状态。 对于这些问题中的任何帮助,将不胜感激。
您可能已经注意到,在bids
表中(我假设是表名),有一个名为created_at
。 您可以将其用作start-time
指示器。
在“ bids
页面中,您可以向seller
显示所有出价。 你可以
bids.where('bids.created_at > ?', 24.hours.ago)
) bids
但禁用24 Hours
之前创建的出价 更好的方法是使用status
属性跟踪出价的status
。 要在24小时后使bid
无效,您可以使用sidekiq
, resque
等后台处理器。
例如:使用Sidekiq
BidInvalidator.perform_in(24.hours, 'mike', 1)
BidInvalidator.perform_at(24.hours.from_now, 'mike', 1)
更新
您是否知道如果考虑到某些用户在阿拉斯加的时间落后6小时,可能会根据数据库上created_at时间戳的时区在客户端上检查时间,如果某些用户可能在created_at时间之前提出要约?
好吧,ActiveRecord将所有日期时间存储为UTC时间,以便开发人员可以将其转换为您喜欢的任何时区。
您需要根据用户的时区设置TimeXone
。 您可以将timezone offset
存储在浏览器Cookie中,并获取offset
以在服务器端计算timezone
。
$(document).ready(function(){
if(!($.cookie('time_zone'))) {
current_time = new Date();
expired_after_days = 365;
$.cookie('time_zone', current_time.getTimezoneOffset(), { path: '/', expires: expired_after_days } );
// Here expired_after_days represents the number of days the cookies will store the info
}
})
在application_controller
您可以
# setting the time zone with the current time zone offset
before_filter :set_time_zone
def set_time_zone
time_zone_offset = cookies[:time_zone].to_i
Time.zone = ActiveSupport::TimeZone[-time_zone_offset.minutes]
end
注意 : Time.zone
是线程安全的。
现在您需要使用DateTime.current
代替DateTime.now
它是否提供创建工作人员的功能,例如每十分钟检查一次状态属性。如果取消了投标,我不想立即等待24小时通知买方取消投标
要在特定时间执行任务,您可以使用Whenever gem
创建cronjobs
您实际上不需要计时器。 您只需要时间直到出价有效。 我想您将拥有某种Bit
模型。 当出价在expires_at
列中过期时,由买方商店创建了一点:
class Bid < ActiveRecord::Base
before_create :set_expired_at
private
def set_expired_at
self.expired_at = Time.current + 24.hour
end
end
这样可以添加expired?
您可以在视图中使用该方法确定是否仍要列出商品的同一类的方法:
def expired?
expired_at < Time.current
end
或者,您可以添加范围以仅加载未到期的位:
scope :unexpired, -> { where('expired_at < ?', Time.current) }
如果要约待定或被排除,则可以在数据库中将其实现为简单的accepted
布尔值。 导致以下status
方法:
def status
if accepted?
'accepted'
else
expired? ? 'expired' : 'pending'
end
end
由于所有这些方法都取决于当前时间,因此不需要外部计时器,cron作业或后台作业。 自身的模型始终能够返回当前状态。
你可以使用delayed_job
, sidekiq
或resque
或类似的工具来安排你的函数尽快创建投标调用。 当24小时启动时,调用get函数时,您可以在那里检查该函数是否被接受。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.