簡體   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