2015-01-11 1 views
0

Приложение My Rails 4 имеет таблицу встреч, которая имеет следующие атрибуты/столбцы: «дата» (дата данных типа), «start_at» (время набора данных) и «ends_at» (время набора данных). У меня нет столбца «продолжительность», но вы хотите рассчитать разницу между временами «заканчивается на» и «запускается». Мне нужна продолжительность, поэтому я могу поместить валидацию в модель Appointment, чтобы пользователи не могли назначать встречи менее 30 минут или более 2 часов. Я использовал Google для исследования проблемы, но не нашел ничего особенно полезного для того, что я пытаюсь сделать. Я изучаю Rails и пытаюсь найти лучшие практики. Я предполагаю, что место, где логика «длительности» находится в модели, в отличие от представлений. Сейчас я не считаю, что пользователям нужно будет видеть данные продолжительности. Я начал писать метод «длительности» для модели, но не мог заставить логику работать правильно. Вот что я сделал до сих пор:Нужна помощь в написании метода расчета продолжительности (времени) для модели/просмотров?

protected 

    def duration 
    (self.ends_at - self.starts_at).to_i 
    end 

я вызываю метод с:

validate :duration, numericality: {greater_than: 30, less_than: 120} 

Когда я выполняю код он не создает каких-либо ошибок, но проверка не появляется делать что-нибудь. Пользователи по-прежнему могут назначать встречи менее 30 минут или более 2 часов. Мне нужно предотвратить сохранение обоих сценариев в БД. Я играл с некоторыми утверждениями if и else в методе, но не имел успеха.

Вопросы:

  1. Что случилось с моим текущим кодом?

  2. Есть ли лучший способ подойти к проблеме для достижения моей цели?

  3. Если я решил позже предоставить пользователям информацию о «длительности» через представления, как это сделать, используя встроенный код Ruby?

Я ценю любую помощь и совет!

ответ

1

Вот подход, который я бы, вероятно, принять:

Комментарии к праву были добавлены только, чтобы объяснить немного о том, что происходит.

validate :duration 

private 

def duration 
    length = (ends_at - starts_at)/60 
    return if length.between?(30, 120) # bail out of validation if length falls between the two integers 

errors.add(:base, 'Your error message') # you can change this to something like `:ends_at` if it's preferable.. 
end 

Более подробная информация о comparables in Ruby

Если вы хотите представить продолжительность позже, я бы, скорее всего, идти по пути использования presenter. Но вы также можете просто создать метод экземпляра для этой модели.

# Public: get the duration of the appointment in minutes 
# 
def duration 
    (ends_at - starts_at)/60 
end 

, если это так, то вы можете сделать немного рефакторинга к valiation

validate :correct_duration 

private 

def correct_duration 
    length = self.duration 
    return if length.between?(30, 120) # bail out of validation if length falls between the two integers 

errors.add(:base, 'Your error message') # you can change this to something like `:ends_at` if it's preferable.. 
end 

Надеется, что это работает для тебя.

+0

Thanks Justin! Я рассмотрю этот код при первой возможности. Я буду следить за тобой. – codeinspired

+0

Justin - я пробовал проверку: код длительности, но мне не повезло. Валидация предотвращает сохранение всех назначений независимо от продолжительности. Это как если бы он игнорировал параметры 30, 120 минут. Любые идеи о том, что может быть причиной этого? В очередной раз благодарим за помощь! – codeinspired

+0

Джастин, проблема решена!Ваше добавление «/ 60», чтобы получить продолжительность в минутах, сделало это. Теперь проверка правильности блокирует назначения < 30 or > 120 минут. Фантастика! Кроме того, спасибо за информацию о «докладчиках в Rails». Очень полезно! – codeinspired

Смежные вопросы