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