我在控制器中有一个动作,我想为每个请求连续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)
答案 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
将范围转换为Array
个Date
个对象,每天一个
答案 1 :(得分:1)
由于我完全不了解你的所有要求,所以我会做一些假设:
1
开头,nil
被视为1
Sun, 27 Oct 2013..Wed, 05 Nov 2013
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