0

これがコードです。基本的に、ユーザーは請求日(毎月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で単純化することができます。ありがとう!

4

3 に答える 3

2

私はの線に沿って何かを書くだろう

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

この前に有効な請求日が選択されたことを検証する必要があります

于 2012-08-03T23:51:53.383 に答える
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[]を使用しているため、コントローラーでロジックを実行しています。

于 2012-08-03T23:46:00.097 に答える
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
于 2012-08-04T00:00:52.247 に答える