这是代码。基本上,用户选择结算日(每月的第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中简化它。谢谢!
答案 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