DateTime.now.strftime('Y%m%d%H%M%S') Rails 中的正确字符串格式

DateTime.now.strftime('Y%m%d%H%M%S') proper string format in Rails

我正在尝试为 Rails 中的预订建立参考编号。我正在使用

DateTime.now.strftime('Y%m%d%H%M%S')

用于参考编号并连接一些字符串。我使用 Sidekiq 作为后台作业执行此操作,但后来对结果感到困惑,因为它在 strftime.

中给出了不同的值
def to_reserve
   venue = Venue.find(params[:id])
   venue_name = venue.name.delete(' ')
   reference_number = ReferencesNumberWorker.perform_in(5.seconds,    venue_name) 

   ................

end

Sidekiq:

class ReferencesNumberWorker
    include Sidekiq::Worker

    def perform(venue_name)
        reference_number = DateTime.now.strftime('Y%m%d%H%M%S')
        return venue_name + reference_number
    end
end

这是示例结果:

HotelMatt67fb02cb5da7871f92347df9

没想到结果是对的。

这是将 Sidekiq 作业的哈希值附加到您希望它附加 Sidekiq 结果的 return 的参考号。

基本上就是这个方法

def to_reserve
   venue = Venue.find(params[:id])
   venue_name = venue.name.delete(' ')
   reference_number = ReferencesNumberWorker.perform_in(5.seconds,    venue_name)  <- This line will return Sidekiq job number, not the actual result from Sidekiq perform operation. 

   ................

end

当您定义参考号时,您假设它会为您提供 Sidekiq return,但事实并非如此。这是后台作业的基本点。您正在将 Sidekiq 作业与您正在做的事情断开连接,即卸载到一个单独的进程。所以你不能期望 return,你正在将方法卸载到 Sidekiq。 Sidekiq 的 return 基本上就是职位编号。

如果你想让它工作,那么将你正在做的参考号计算移到 Sidekiq 的 to_reserve 方法中,或者如果它必须在 Sidekiq 中完成,则将所有逻辑从 to_reserve 到 Sidekiq 的 perform 方法。

另请注意,要使用 Sidekiq,您应该将对象的 ID 传递(给 Sidekiq),以便您可以在 Sidekiq 中重新查找它并对对象执行一些 idempotent 操作。在我看来,我认为在这种情况下您不需要使用 Sidekiq。它不必要的复杂性,但对每个人来说都是自己的。

旁注:优先使用时间 class(Time#now 对比 DateTime#now)而不是 DateTime 来计算 strftime 方法。它是一种纯粹的 Ruby 方法,比 DateTime class(已知的性能瓶颈)更快。此外,您的代码不会硬依赖 Rails。