ruby on rails -更改日期月份不起作用



我有一个付款列表,如果它必须完成X次,我想通过在前一个日期上加1来更新这个月。

例如,每月支付3次,今天节省下来:

  • 03/05/2013
  • 04/05/2013
  • 05/05/2013

我写了这个:

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

但是问题是它返回:

  • 05/05/2013
  • 05/05/2013
  • 05/05/2013

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

您应该使用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方法非常有用,对于每个Integer (Fixnum),你可以调用.times来迭代X次)

我们在这里使用的另一个非常有用的方法是.months,它可用于整数(固定数)。它将Integer转换为Date中的月份数。它也适用于.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

如果你想做我认为你是——也就是说,返回日期数组,在你的@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

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

相关内容

  • 没有找到相关文章

最新更新