将 7 天递归添加到 rails 5.2.3 ruby 中的日期的最佳方法是什么

What is the best way to add seven days recursively to a date in ruby on rails 5.2.3

我目前创建多个预订端点,这需要数周时间作为参数“数量”。

到目前为止我有这个:

在我的控制器操作中:

     def multiple
          @qty = params[:qty]
          @booking = Booking.new(booking_params)
          if @booking.save 
            @newbookings = @booking.createmore(@qty)
            render json: @newbookings, status: :created
          else 
            render json: @booking.errors, status: :unprocessable_entity
          end
      end

在我的模型中,我有一个创建多个的例程。

    def createmore(quantity)
        bookings = []
        quantity.to_i.times do 
            bookings.push(self)
        end 
        puts "#{@bookings}"
        newbookings = []
        firstBooking = self

        bookings.each do | booking |
            booking.start = firstBooking.start
            booking.end = firstBooking.end
            booking.name = firstBooking.name
            booking.email = firstBooking.email
            booking.contact = firstBooking.contact
            newbookings.push(booking)
        end
        newbookings.each do | booking |
            booking.save
        end
    end

问题是,如何递归地向日期添加一周。即第二次预订增加 7 天,第三次预订增加 14 天,第四次预订增加 21 天,依此类推,直到数量为零。

我可以在 JavaScript 中立即执行此操作,但不知道在 ruby 中从哪里开始。如果有任何帮助,我将不胜感激。

您可以使用 Active Support 中包含的 each_with_index method from the Enumerable module together with the additions to the time management extensions。一个简化的示例如下所示:

bookings.each_with_index do |booking, i|
  booking.start = firstBooking.start + i.weeks
end

索引i从0开始,所以第一次预订将保持原来的开始日期(增加0周)。其余周将比原来的周晚 i 周开始。

编辑

正如 Scott 指出的那样,只要更新其中一个元素,所有元素都会更新。这里的关键是没有一个包含 n 个对象的数组可以独立更新,有一个数组包含 n 个对同一对象的引用,因此对其中一个对象所做的更改适用于所有对象其中

可能您想每次都 push a copy of the original object 而不是推送原始元素:

quantity.to_i.times do 
  bookings.push(self.dup)
end

这样一来,实际上将有 n 个原始对象的副本,您将能够分别更新每个副本。