Javascript 我如何在Rails中实现卖家可以在24小时内取消或接受的出价或交易被取消?
我正在rails的一个市场上工作,该市场允许买家向卖家报价,作为对上市的出价。卖方可以取消或接受投标,但只有24小时的时间窗口,否则投标将到期,交易将被取消。用户既可以是买方也可以是卖方 我有一个代表每个交易的订单模型Javascript 我如何在Rails中实现卖家可以在24小时内取消或接受的出价或交易被取消?,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,我正在rails的一个市场上工作,该市场允许买家向卖家报价,作为对上市的出价。卖方可以取消或接受投标,但只有24小时的时间窗口,否则投标将到期,交易将被取消。用户既可以是买方也可以是卖方 我有一个代表每个交易的订单模型 Class Order < ActiveRecord::Base belongs_to :seller, class_name: "User" belongs_to :buyer, class_name: "User" belongs_to :lis
Class Order < ActiveRecord::Base
belongs_to :seller, class_name: "User"
belongs_to :buyer, class_name: "User"
belongs_to :listing
end
我想区分买方取消和卖方取消,因为如果卖方取消了一个上市的投标,买方不支付投标费,但如果买方取消了订单,他将收取投标费。如何实现投标事务。最困难的部分是在rails中创建一个计时器,向卖方显示还剩多少时间,例如投标到期前4小时12分钟,如果没有响应,则在24小时后取消投标,尤其要记住,不同的客户端时区可能与订单时创建的_相隔数小时。我还需要将订单状态显示为pending、Cancelled或accepted,这排除了布尔函数,因为这会创建三种可能的状态。如果您能在这些问题上提供任何帮助,我们将不胜感激 您可以使用
delayed_job
、sidekiq
或resque
或类似工具来安排在创建投标时立即调用您的功能。当24小时结束时,调用函数get时,您可以在那里检查它是否被接受。您可能已经注意到,在投标
表格(我假设表格名称)中,有一个名为的字段在处创建。您可以将其用作开始时间
指示器
在bids
页面中,向卖家显示所有投标。要么你可以
- 仅显示有效的出价(
bids.where('bids.created_at>?',24小时前)
)
- 或者,显示所有
投标
,但禁用在24小时之前创建的投标
更好的方法是使用status
属性跟踪投标的状态。要在24小时后使投标无效,您可以使用后台处理器,如sidekiq
,resque
例如:使用Sidekiq
BidInvalidator.perform_in(24.hours, 'mike', 1)
BidInvalidator.perform_at(24.hours.from_now, 'mike', 1)
更新
你知道如何根据时间来检查客户端的时间吗
如果考虑到
帐户某些用户可能会在创建\u之前提供,如果
他们在阿拉斯加落后6小时
ActiveRecord以UTC时间存储所有日期时间,以便开发人员可以将其转换为您喜欢的任何时区
您需要根据用户的时区设置TimeXone
。您可以在浏览器cookie中存储时区偏移量
,并获取偏移量
,以在服务器端计算时区
$(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
}
})
在应用程序\u控制器中
可以
# 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
注意:时区
是线程安全的
现在
它是否提供功能来创建检查
状态属性每隔十分钟更新一次。如果
出价立即被取消,我不想等待24小时之前
通知买方投标被取消
要在特定时间点执行任务,您可以使用创建cronjobs,而不需要计时器。你只需要时间,直到出价有效。我想你会有某种Bit
模型。当买家商店在
列的
过期\u中创建bit时:
class Bid < ActiveRecord::Base
before_create :set_expired_at
private
def set_expired_at
self.expired_at = Time.current + 24.hour
end
end
或者您可以添加一个作用域以仅加载未过期的位:
scope :unexpired, -> { where('expired_at < ?', Time.current) }
由于所有这些方法都取决于当前时间,因此不需要外部计时器、cron作业或后台作业。模型本身始终能够返回当前状态。感谢您的响应。如果您考虑到一些用户可能会在创建的时间戳之前提供报价,那么您知道如何根据数据库上创建的时间戳的时区检查客户端的时间吗?如果他们居住在阿拉斯加,并且我以前没有使用过sidekiq,那么他们可能会在创建的时间戳之前提供报价。它是否提供了创建一个工作人员的功能,该工作人员每隔十分钟检查一次状态属性。如果出价立即被取消,我不想在通知买家出价被取消之前等待24小时。谢谢。您的解释非常有助于展示如何使客户端和数据库时区一致;我还有什么办法可以帮你解决这个问题吗?一旦中标,我很难想出最好的办法来执行取消按钮。重要的是,应用程序知道是谁取消了订单,因为如果卖方取消订单,则不收取投标费,但如果买方取消订单,则会收取投标费。我不能执行删除操作,因为如果我删除订单,我不知道是谁取消了订单。不知道我是否需要ajax post操作来更新订单模型的卖家取消属性和状态属性,或者使用编辑表单,这会很奇怪,因为用户唯一要做的就是提交取消提交按钮。确保您没有脱离问题的上下文;如果你能单独提出一个问题,那就太好了。这将引起其他贡献者的注意,也将有助于其他有类似问题的开发人员。我在问题中添加了我的模型。使用Time.current而不是Time.now有什么原因吗?我希望能够根据时间戳上创建的时间检查用户时区。考虑到不同的全球时区,您知道如何实现这一点吗?您的订单
模型基本上与我所想到的Bit
模型类似。只需在
datetime和accepted添加一个expired\u即可
def expired?
expired_at < Time.current
end
scope :unexpired, -> { where('expired_at < ?', Time.current) }
def status
if accepted?
'accepted'
else
expired? ? 'expired' : 'pending'
end
end