获得10个批次,从一定数量开始并包括一定数量

时间:2013-10-27 14:04:17

标签: ruby-on-rails ruby

我在控制器中有一个动作,我想为每个请求连续10天生成一批。

我通过为每个批次传递变量page来跟踪我们在批处理周期中的位置。

批次的循环应该从今天开始。

我如何以最简单的方式表达这一点?

现在我有下面的混乱,甚至不起作用(每个批次,除了第一个,过早开始一天):

@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)

2 个答案:

答案 0 :(得分: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允许您将范围指定为连续天数范围,to_a将范围转换为ArrayDate个对象,每天一个

答案 1 :(得分: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