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) ごとに、.timesX 回反復するために呼び出すことができます)

ここで使用するもう 1 つの非常に便利な方法は.months、整数 (Fixnum) で使用できるものです。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
于 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 に答える