3

invoices对于我的 Rails 应用程序,我正在尝试构建一个 rake 任务,该任务将为每个数据库填充 10个user

def make_invoices
  User.all.each do |user|
    10.times do
      date = Date.today
      i = user.invoices.create!(:number => user.next_invoice_number,
                                :date   => date += 1.year)
      i.save
    end
  end
end

我怎样才能增加date一年?

4

4 回答 4

5

将循环更改为:

10.times do |t|
   puts t + 1 # will puts 1,2,3,4,5,6,7,8,9,10
end

现在你可以设置你的年份了。

于 2013-09-21T14:01:38.047 回答
1

您可以利用Date#next_year,它带有一个参数,表示您想要提前多少年:

def make_invoices
  User.all.each do |user|
    10.times.with_object(Date.today) do |i, date|
      user.invoices.create!(
        number: user.next_invoice_number, 
        date: date.next_year(i)
      )
    end
  end
end

Numeric#times将索引传递给块。

Enumerator#with_object允许向块传递额外的参数,我们在这里使用它来避免在块之外设置局部变量(因为我们不需要它在外面)。

于 2013-09-21T14:13:32.973 回答
1

它在这里使用Date#next_year

require 'date'

d = Date.today 
d # => #<Date: 2013-09-21 ((2456557j,0s,0n),+0s,2299161j)>
d.next_year # => #<Date: 2014-09-21 ((2456922j,0s,0n),+0s,2299161j)>
于 2013-09-21T14:00:43.890 回答
1
def make_invoices
  User.all.each do |user|
    date = Date.today
    10.times do
      user.invoices.create!(:number => user.next_invoice_number, 
                            :date   => (date += 1.year))
    end
  end
end

因为你date = Date.today10.times循环中,它会在每个循环中被重置。只是移动date = Date.today到循环之外。

于 2013-09-21T14:03:25.270 回答