[英]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.