Rails - запрос сдвигов времени - PullRequest
0 голосов
/ 29 апреля 2018

В настоящее время я разрабатываю систему, которая управляет рабочими сменами.

Система содержит конечную точку, которая возвращает текущую смену на основе времени сервера. Я создал запрос, который отлично работает для регулярных смен, например, с 08:00 до 16:00 и т. Д., Но проблема заключается в том, что есть рассветная смена, которая начинается с 22:00 до 06:00 другого дня.

Моя модель содержит следующие поля:

  • name (String)
  • start_at (Время)
  • end_at (Время)

Ps .: Я использую Postgres в качестве базы данных.

Мой код:

class Shift < ApplicationRecord
  def self.current
    current_time = Time.now()
    current_time = current_time.change(year: 2000, month: 1, day: 1)

    @current ||= Shift
                  .where('start_time <= ?', current_time)
                  .where('end_time >= ?', current_time)
                  .first()
  end
end

Ps .: Я полагаю, поскольку я использую тип времени в базе данных, я должен нормализовать Time.now , чтобы использовать дату 2000 - 01 - 01.

Итак, есть ли простой / лучший способ сделать это?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вас может заинтересовать tod gem , который предоставляет класс TimeOfDay и класс Shift, который принимает два объекта TimeOfDay для представления начала и конца смены. Обрабатывает смены рассвета, как и ожидалось.

Реализация может выглядеть так:

require 'tod'

class Shift < ApplicationRecord
  def self.current
    find(&:current?)
  end

  def current?
    schedule.include?(Tod::TimeOfDay(Time.now))
  end

  def schedule
    Tod::Shift.new(Tod::TimeOfDay(start_time), Tod::TimeOfDay(end_time))
  end
end
0 голосов
/ 29 апреля 2018

Интересная проблема! Таким образом, есть два случая: (1) нормальный сдвиг (где start_time <= end_time) и (2) сдвиг, который перекрывает полночь (где start_time > end_time).

Вы уже обрабатываете первый случай, проверяя, находится ли текущее время между временем начала и временем окончания.

Я полагаю, что второй случай может быть обработан путем проверки, является ли текущее время или между временем начала и полуночи, или между полуночью и временем окончания. Что переводится как start_time <= ? OR end_time >= ?.

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

@current ||= Shift
  .where('start_time <= end_time')
  .where('start_time <= ?', current_time)
  .where('end_time >= ?', current_time)
  .or(Shift
    .where('start_time > end_time')
    .or(Shift
      .where('start_time <= ?', current_time)
      .where('end_time >= ?', current_time)))
  .first()

Если вы пойдете с этим, рассмотрите возможность разделения двух случаев на отдельные области действия , чтобы вы могли написать что-то более читаемое, например, в этом методе:

@current ||= current_normal_shifts.or(current_dawn_shifts).first
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...