0

リクエストごとに連続 10 日間のバッチを生成するコントローラーにアクションがあります。

pageバッチごとに変数を渡すことで、バッチ サイクルのどこにいるかを追跡します。

バッチのサイクルは今日から開始する必要があります。

これを最もシンプルに表現するにはどうすればよいでしょうか。

現在、次の混乱がありますが、機能していません (最初のバッチを除く各バッチは、1 日早く開始されます)。

@page_number = (params[:page_number] || 0).to_i + 1
today        = Date.today
batch_amount = 10
first_day_of_current_batch = today + (batch_amount * (@page_number - 1))
days         = first_day_of_current_batch..(first_day_of_current_batch + batch_amount)
4

2 に答える 2

1

から始まるページ番号を付けることをお勧めします0(つまり、最初のページ #0 は から始まりますDate.today)。その後、次を使用できます。

@page_number = (params[:page_number] || 0).to_i
batch_amount = 10
first = (@page_number * batch_amount).days.from_now.to_date
last  = ((@page_number + 1) * batch_amount - 1).days.from_now.to_date
days = (first..last).to_a

ではto_date、範囲を連続する日の範囲として指定できます。 では、その範囲を1 日ごとに 1 つのオブジェクトのto_aに変換します。ArrayDate

于 2013-10-27T18:02:05.657 に答える
1

あなたのすべての要件を完全には理解していないので、いくつかの仮定を立てます。

  • で始まるページは1、次のnilように想定されます1
  • 今日は 10 月 27 日です。バッチ サイズが 10 でページ番号が 1であると仮定すると、バッチは次のようになります。Sun, 27 Oct 2013..Wed, 05 Nov 2013
  • 今日は 10 月 27 日です。バッチ サイズが 10 でページ番号が 2であると仮定すると、バッチは次のようになります。Sun, 06 Oct 2013..Wed, 15 Nov 2013

そこには非常に複雑なロジックがあるため、それを別のオブジェクトに抽出するのが賢明です。コードとテストを分離するため、一般的で適切な方法と見なされます。カスタムクラス:

# app/services/batch_of_days.rb
class Services::BatchOfDays
  class << self
    def create(page_nr = 1, batch_size = 10, start_from = Date.today)
      new(page_nr.to_i, batch_size, start_from).create
    end
  end

  def initialize(page_nr, batch_size, start_from)
    @page_nr    = page_nr
    @batch_size = batch_size
    @start_from = start_from
  end

  def create
    first_day..last_day
  end

private
  def first_day
    @first_day ||= @start_from + ( @page_nr - 1 ) * @batch_size
  end

  def last_day
    first_day + @batch_size - 1
  end
end

使用法:

irb(main):262:0> BatchOfDays.create
# => Sun, 27 Oct 2013..Tue, 05 Nov 2013
irb(main):262:0> BatchOfDays.create(1)
# => Sun, 27 Oct 2013..Tue, 05 Nov 2013
irb(main):263:0> BatchOfDays.create(2)
# => Wed, 06 Nov 2013..Fri, 15 Nov 2013
irb(main):264:0> BatchOfDays.create(3)
# => Sat, 16 Nov 2013..Mon, 25 Nov 2013
于 2013-10-27T21:26:17.127 に答える