[英]Refactor this if else between block of Ruby/Rails code
这是代码。 基本上,用户选择结算日(每月的第1天,或每月的第15天)。 start_date
是“合同”开始的时候, expire_date
是它到期的时候。
所以,如果今天是第3天,并且他们希望在15日收费,那么只需转到当月的第15天。 但是,如果今天是第3名,并且他们希望在第一次收费,则获得下个月的第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中简化。 谢谢!
我会写一些东西
expire_date = start_date.change(:day => params[:billing_day])
if expire_date <= start_date
expire_date += 1.month
end
您需要验证在此之前选择了有效的结算日
想出了这个。 但不确定这是不是好主意
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 [],所以您在控制器中执行此操作。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.