如果在Ruby / Rails代码块之间的其他地方重构这个

时间:2012-08-03 22:46:42

标签: ruby-on-rails ruby ruby-on-rails-3 refactoring ruby-on-rails-3.2

这是代码。基本上,用户选择结算日(每月的第1天,或每月的第15天)。 start_date是“合同”开始时,expire_date到期时。{/ p>

所以,如果今天是第3名,并且他们希望在15日收费,那么只需转到当月的第15天。但是,如果今天是第3名并且他们希望在第一次收费,则获得下个月的第一天......等等。

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中简化它。谢谢!

3 个答案:

答案 0 :(得分:2)

我会按照

的方式写一些内容
expire_date = start_date.change(:day => params[:billing_day])
if expire_date <= start_date
  expire_date += 1.month
end

您需要验证在此

之前选择了有效的结算日

答案 1 :(得分: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 [],所以您在控制器中执行此操作。

答案 2 :(得分: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
相关问题