2014-08-28 2 views
1

Допустим, у меня есть модель под названием Отсутствие, которая выглядит примерно такрубин проверить, если текущая дата находится в пределах даты записей

  :id => :integer, 
:employee_id => :integer, 
:start_date => :date, 
    :end_date => :date 

мне нужно проверить, если сотрудник находится далеко сегодня, и возвращает истину, если они есть. Кто-то, если у них есть запись отсутствия, что

  1. имеет дату начала сегодня или до сегодняшнего дня,
  2. Имеет дату завершения, которая является либо нулевым, или сегодня или впереди сегодня.

так мне нужен метод на Работника, который является чем-то вроде

def is_away 
    ????? 
end 

, пожалуйста, помогите!

+0

Вы пытались использовать 'Time.now' для текущей даты и сравнивать с атрибутами' start_date' и 'end_date'? – lurker

+0

Gararth, если вы нашли хотя бы один из полезных ответов, пожалуйста, выберите тот, который вам больше всего понравился. –

ответ

0

Вы также можете попробовать это.

def is_away? 
    (start_date <= Date.today) and (end_date.nil? or end_date <= Date.today) ? true : false 
end 
+0

Тернарный оператор бесполезен здесь, поскольку вы уже возвращаете «истину» или «ложь» из своего первого условия, но в остальном ваше решение в порядке. –

+0

Должно быть 'end_date> = Date.today'. – Mischa

2

Я хотел бы сделать что-то вроде этого:

# add this to absence.rb 
def covers_today? 
    (start_date..end_date).cover?(Date.today) 
end 

# add this to employee.rb 
def away? 
    absences.any?(&:covers_today?) 
end 

После этого просто позвоните away? по принципу employee:

@employee.away? 
# => true, if employee has an absense that covers the current date 
+0

Не будет ли это повторяться во всех абсансах и проверять каждый «start_date» и «end_date» один за другим? Не лучше ли было бы делать запрос в SQL, как в решении Стефана? – Mischa

+0

@ Мича, ты прав. Это загружает все пропуски и запускает проверку против них. Это медленнее, чем просто проверка на существование, как это делает Стефан. Но я уверен, что вы хотите показать более подробную информацию о его отсутствии (диапазон данных, например), если вы узнали, что он ушел. Или вы хотите показать, когда он ушел в последний раз. Или сколько дней уходит он в прошлом году. С моим ответом нет необходимости в вызове второй базы данных, но для решения Stefans требуется второй запрос. И запросы к базе данных обычно намного медленнее, чем итерация по небольшому массиву в памяти. Поэтому я думаю, что это зависит ... – spickermann

2

Предполагая, что Employee has_many :absences, это должно работать:

def away?(date = Date.today) 
    absences.where('start_date <= :date AND (end_date >= :date OR end_date IS NULL)', date: date).exists? 
end 
+0

Я думаю, что это намного лучше, чем ответы до сих пор, потому что он просто сделает один запрос, чтобы узнать, нет ли у пользователя. Если в других ответах вы повторяете каждое отсутствие и проверяете, был ли пользователь в коде. Это нужно сделать в базе данных с помощью простого запроса. – Mischa

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