@WonderMetal

Как правильней сделать рефакторинг?

class Reservation < ActiveRecord::Base

  validates :table, presence: true
  validates :start, presence: true
  validates :finish, presence: true


  validate :checking_the_time, :uniqueness_reservation

  scope :tables, ->(table) { where("'reservations'.'table' = ? ", table) }

 
  def checking_the_time
    if start >= finish
      errors.add(:finish, "Invalid time range")
    end
  end

  def uniqueness_reservation
    unless Reservation.diapazone(start, finish).tables(table).where.not(id: id).empty?
      errors.add(:booked_from, 'Invalid period.')
    end
  end


  private

  def self.diapazone(start, finish)
    where("(start >= :s AND finish <= :f) OR (start <= :s AND finish >= :s)
             OR (start <= :f AND finish >= :f)",
          {s: start, f: finish})
  end


end


помогите с рефакторингом валидации uniqueness_reservation, валидация на то что б новый заказ никак не пересекался с существующим
  • Вопрос задан
  • 2419 просмотров
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
Вообще, программирование уже давно не в машинных кодах производится. Немного бизнес-логики не помешало б. Что такое tables? Вы сдаете квартиру и проверяете, что б в одном временном интервале был только один заказ?
Тогда все проще
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы