我有一个付款清单,如果必须完成X次,我想通过在上一个日期添加+1来更新月份。
例如,今天每月保存3次付款:
我写了这个:
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
但问题是它会回归:
你能告诉我我哪里错了吗?
答案 0 :(得分: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
方法非常有用,对于每个Integer(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
答案 1 :(得分: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
次应该做的伎俩:
{{1}}
这应该返回一个日期数组。