0

这是代码。基本上,用户选择一个计费日(每月 1 日,或每月 15 日)。start_date是“合同”开始时,是expire_date到期时。

因此,如果今天是 3 号,并且他们想在 15 号结算,那么只需转到当月的 15 号。但是,如果今天是第 3 天,并且他们想在第 1 天计费,则获取下个月的第 1 天......等等。

if params[:billing_day] == 1 && start_date.day > 1
  expire_date = start_date.at_beginning_of_month.next_month
elsif params[:billing_day] == 15 && start_date.day < 15
  expire_date = start_date.change(:day => 15)
elsif params[:billing_day] == 15 && start_date.day > 15
  expire_date = start_date.at_beginning_of_month.next_month.change(:day => 15)
else
  expire_date = start_date.change(:day => params[:billing_day])
end

这看起来很疯狂,当然它可以在 Rails 中简化。谢谢!

4

3 回答 3

2

I would write something along the lines of

expire_date = start_date.change(:day => params[:billing_day])
if expire_date <= start_date
  expire_date += 1.month
end

You'd need to validate that a valid billing day was picked before this

于 2012-08-03T23:51:53.383 回答
0
class ExpireDate

  def initialize(billing_day, start_date)
    @billing_day = billing_day
    @start_date = start_date
  end 

  def expires_on
    if billing_day == 1
      return billing_on_1st
    elsif billing_day == 15
      return billing_on_15th
    else
      raise "Unknown billing_day"
    end
  end

  def billing_on_1st
    if @start_date.day > 1
      return @start_date.at_beginning_of_month.next_month
    else
      return @start_date.change(:day => @billing_day)
    end
  end

  def billing_on_15th
    if @start_date.day < 15
      return @start_date.change(:day => 15)
    else
      return @start_date.at_beginning_of_month.next_month.change(:day => 15)
    end
  end
end


expire_date = ExpireDate.new(params[:billing_day], start_date).expires_on
于 2012-08-04T00:00:52.247 回答
0

想出了这个。但不确定这是不是好主意

expire_date = if params[:billing_day] == 1 && start_date.day > 1
  start_date.at_beginning_of_month.next_month
elsif params[:billing_day] == 15 && start_date.day < 15
  start_date.change(:day => 15)
elsif params[:billing_day] == 15 && start_date.day > 15
  start_date.at_beginning_of_month.next_month.change(:day => 15)
else
  start_date.change(:day => params[:billing_day])
end

万一params[:billing_day] == 15 && start_date.day == 15呢?应该发生什么?

也想出了这个,但它的行为有点不同start_date.day == 15

expire_date = if params[:billing_day] == 1 && start_date.day > 1
  start_date.at_beginning_of_month.next_month
elsif params[:billing_day] == 15
    if start_date.day < 15
        start_date.change(:day => 15)
    else
        start_date.at_beginning_of_month.next_month.change(:day => 15)
    end
else
   start_date.change(:day => params[:billing_day])
end

另请注意,在 Rails 中,将逻辑放入模型中是一种很好的做法,并且由于您使用的是 params[],因此您是在控制器中执行此操作。

于 2012-08-03T23:46:00.097 回答