Подсчет дней, исключая выходные - PullRequest
12 голосов
/ 04 января 2010

Я создаю библиотечную систему в Ruby on Rails и пытаюсь найти способ рассчитать просроченные дни, исключая выходные дни, когда возвращен заемный элемент. Сейчас я просто вычисляю «дневную шкалу» как разницу между сроком исполнения и датой, когда товар был фактически возвращен, но я хочу исключить выходные, поскольку товары можно вернуть только в рабочие дни.

Это мой первый реальный опыт работы с Ruby и Rails, поэтому приношу свои извинения, если я упустил что-то очевидное. Спасибо за любую помощь, которую вы все можете предоставить.

Вот код, который у меня есть для функции «return»:

   def return
     @product = Product.find(params[:id])
     today = Date.today
     dayslate = today - @product.due_date
     if @product.due_date >= today
       @product.borrower = @product.check_out = @product.due_date = @product.extended_checkout = nil
       @product.save!
       flash[:notice] = "Okay, it's checked in!"
       redirect_to(products_url)
     else
       @product.borrower = @product.check_out = @product.due_date = @product.extended_checkout = nil
       @product.save!
       flash[:notice] = "Checked in, but it was #{dayslate} days late!"
       redirect_to(products_url)
     end
 end 

Ответы [ 11 ]

0 голосов
/ 05 января 2010

нейтрино совершенно прав насчет перемещения всей логики, которая не задействована при отображении / рендеринге / перенаправлении в модели.

* 1003 Е.Г. *

class ProductLoan
  def due_date_passed?
    days_late > 0
  end

  def days_late
    Date.today - due_date
  end

  def complete!
    self.borrower = self.check_out = self.due_date = self.extended_checkout = nil
    save
  end
end

class ReturnsController
  def create
    @product = ProductLoan.find(params[:id])

    if @product.due_date_passed?
      flash[:notice] = "Okay, it's checked in!"
    else
      flash[:notice] = "Checked in, but it was #{@product.days_late} days late!"
    end
    @product.complete!

    redirect_to products_url
  end
end

Я только что набрал это, не тестируя его, но что-то в этом духе могло бы подсчитать прошедшие дни, исключая выходные:

class DateOffsetCalculator
  DAYS_IN_A_WEEK = 7
  DAYS_IN_A_WEEKEND = 2

  def initialize(date)
    @date = date
  end

  def compute
    days_passed - weekend_days_passed
  end

  def days_passed
    (Date.today - @date).to_i
  end

  def weekend_days_passed
    weekends_passed * DAYS_IN_A_WEEKEND
  end

  def weekends_passed
    rounded_up_week_days / DAYS_IN_A_WEEK
  end

  def rounded_up_week_days
    days_passed + commercial_working_day_correction
  end

  def commercial_working_day_correction
    @date.cwday - 1
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...