0

这是代码。基本上,用户选择一个计费日(每月的第一天或每月的第15天)。 start_date是当“合同”开始时,expire_date何时到期。重构此代码块之间的Ruby/Rails代码

因此,如果今天是第三位,并且他们希望在15日结算,那么只需到当前月份的第15天即可。但是,如果今天是第三,他们希望在第一次进行结算,然后拿到下个月的第一天...等

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

回答

2

我会写沿

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

线的东西你需要验证一个有效的结算日是这个

+0

简短而甜美。完美的重构!谢谢 – 2012-08-04 01:31:49

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 []你正在控制器中执行它。

+0

感谢有关在模型逻辑提醒前采摘; ) – 2012-08-04 01:32:09

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