繁体   English   中英

如何在Rails出价中实施卖方可以在24小时内取消或接受或交易被取消的出价?

[英]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无效,您可以使用sidekiqresque等后台处理器。

例如:使用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_jobsidekiqresque或类似的工具来安排你的函数尽快创建投标调用。 当24小时启动时,调用get函数时,您可以在那里检查该函数是否被接受。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM