0

У меня есть две модели ...# Активные проверки записей:: Как проверить атрибуты даты в Rails (custom_validations)?

модели/Resident.rb: has_many: листья

модели/leave.rb: BELONGS_TO: резидентный

Теперь я хотите проверить атрибуты модели отпуска до их создания.

leave.rb атрибуты: дата_начала END_DATE, назначения

вот мой отпуск модель:

class Leave < ActiveRecord::Base 
    belongs_to :resident 
    validates :destination,presence:true 
    validates :end_date,presence: true 
    validates :start_date,presence: true 
    before_create :check_correct_leave 

    private 

    def check_correct_leave 

    if resident.hostel.hostel=='J' 
    (self.end_date - self.start_date).to_i == 4 || (self.end_date - self.start_date).to_i == 5 

    else 
    errors.add(:start_date, "Leave are granted only 4 or 5 days") 
    end 

    end 

end 

Я хочу check_correct_leave метод также проверить -> если резидент уже имеет отпуск (хранится в модели отпуска) этого месяца (месяц означает jan, feb и т. д.), тогда он должен сгенерировать ошибку, которая:

«Вы не можете отметить отпуск, потому что вы уже отметили разрешение на этот месяц» и модель не должна хранить этот отпуск. Спасибо!

ответ

1

Вы можете добавить еще один метод проверки, как этот

validate :check_leaves_in_same_month 


def check_leaves_in_same_month 
    if self.resident.leaves.where('start_date > ?', self.start_date.beginning_of_month).any? 
     errors.add("You can't mark leave cause you have already marked leave for this month") 
    end 
end 
+0

он работает, но Im получает ошибку вспышки от моего контроллера: определения функции создания @ отпуск = current_user.resident.leaves.create (leave_params) если @ leave.save вспышки [: Информация] = «Оставить успешно отмеченным» redirect_to leaves_path еще flash [: danger] = "Отметьте свой отпуск снова (не покидайте Vaild)!" redirect_to new_leave_path конец end' ** вспышка [: опасность] = "! Марк Ваш Отпуска Again (Не непросроченный Leave)" ** это одна ошибка .. –

+0

если вы хотите показать добавил сообщение об ошибке, вы можете изменить флэш [: опасность] на 'flash [: danger] = @ leave.errors.full_messages.first' –

+0

Да, это работает, но когда я создаю отпуск, он показывает мне ошибку -> ** Вы можете ' t mark leave, потому что вы уже отметили отпуск в этом месяце ** , но отпуск сохраняется в базе данных !! как это исправить? –

0
def has_leave_for_the_same_month? 
    resident.leaves.any? do |other_leave| 
    other_leave.start_date.month == leave.start_date.month 
    end 
end 

errors.add(...) if has_leave_for_the_same_month? 
+0

не работает ... –

+0

http://apidock.com/ruby/Enumerable/any%3F –

+0

Вы должны использовать какие-либо? блок –