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

时间:2015-08-21 15:34:00

标签: ruby-on-rails ruby sidekiq

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

strftime

表示引用号并连接一些字符串。我使用Sidekiq作为后台工作执行此操作但后来与结果混淆,因为它在def to_reserve venue = Venue.find(params[:id]) venue_name = venue.name.delete(' ') reference_number = ReferencesNumberWorker.perform_in(5.seconds, venue_name) ................ end 中给出了不同的值。

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

Sidekiq:

HotelMatt67fb02cb5da7871f92347df9

这是一个示例结果:

{{1}}

我没想到会得到正确的结果。

1 个答案:

答案 0 :(得分:2)

将Sidekiq作业的哈希值附加到您的参考号,您希望它附加Sidekiq结果的返回值。

基本上这个方法

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

当你定义参考号时,你会假设它会给你Sid​​ekiq的回报,但它不会。这是后台工作的基本点。您将Sidekiq作业与您正在执行的操作断开连接,即卸载到单独的进程。因此,您不能期望返回,您将该方法卸载到Sidekiq。 Sidekiq的回报基本上是工作号码。

如果您希望这一点工作,那么将您在to_reserve方法中执行的参考编号计算移动到Sidekiq,或者如果必须在Sidekiq中完成,则移动{{1}的所有逻辑到Sidekiq的to_reserve方法。

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

旁注:优先于DateTime的时间类(performTime#now)来计算DateTime#now方法。它是一个纯Ruby方法,比DateTime类(一个已知的性能瓶颈)更快。您的代码也不会对Rails有很强的依赖性。