Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何在Rails中实现卖家可以在24小时内取消或接受的出价或交易被取消?_Javascript_Ruby On Rails_Ruby - Fatal编程技术网

Javascript 我如何在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

我正在rails的一个市场上工作,该市场允许买家向卖家报价,作为对上市的出价。卖方可以取消或接受投标,但只有24小时的时间窗口,否则投标将到期,交易将被取消。用户既可以是买方也可以是卖方

我有一个代表每个交易的订单模型

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