0

我有一个付款清单,如果必须完成 X 次,我想通过在前一个日期添加 +1 来更新月份。

例如,今天每月节省 3 次的付款:

  • 2013 年 3 月 5 日
  • 2013 年 4 月 5 日
  • 2013 年 5 月 5 日

我写了这个:

for payment in @order.payments
  if (payment.monthly)
    for month in 0..(payment.nb_of_times - 1)
      payment.date = payment.date.to_date >> month
      ordered_payment << payment
    end
  else
    ordered_payment << payment
  end
end

但问题是它返回:

  • 2013 年 5 月 5 日
  • 2013 年 5 月 5 日
  • 2013 年 5 月 5 日

你能告诉我我哪里错了吗?

4

2 回答 2

0

您应该使用 Rails 方式来实现您的代码:

@order.payments.each do |payment|
  if payment.monthly
    payment.nb_of_times.times do |nb_month|
      payment.date = payment.date + nb_month.months # this is awkward because of the variable name
      payment.save
      ordered_payment << payment
    end
  else
    ordered_payment << payment
  end
end

(该.times方法非常有用,对于每个整数(Fixnum),您都可以调用.times它以迭代 X 次)

我们在这里使用的另一个非常有用的方法.months是可用于整数(Fixnum)。它将整数转换为日期中的月份数。它也适用于.years, .hours,.weeks等:

irb(main):008:0> Time.now + 1.years
#=> 2014-03-05 10:09:58 -0500
irb(main):009:0> Time.now + 1.months
#=> 2013-04-05 10:10:01 -0400
irb(main):010:0> Time.now + 1.hours
#=> 2013-03-05 11:10:04 -0500
irb(main):011:0> Time.now + 1.seconds
#=> 2013-03-05 10:10:08 -0500

# With a variable:
irb(main):014:0> Time.now + Patient.first.id.hours
  Patient Load (1.1ms)  SELECT "patients".* FROM "patients" LIMIT 1
#=> 2013-10-08 06:12:04 -0400
于 2013-03-05T14:43:16.383 回答
0

如果您正在尝试做我认为您要做的事情 - 也就是说,在您的@order.payments日期之后以月为间隔返回一个日期数组,对于payment.nb_of_times时间,这应该可以解决问题:

ordered_payment = []
@order.payments.each do |payment|
  if payment.monthly
    payment.nb_of_times.times do |i|
      ordered_payment << payment.date + (i+1).months
    end
  else
    ordered_payment << payment.date
  end
end

这应该返回一个日期数组。

于 2013-03-05T14:49:56.413 回答