Я создаю систему, которая должна быть уверена, что запланированные "поездки" не пройдут на коленях. Для этого я пытаюсь проверить start_date и end_date, чтобы убедиться, что они не находятся в датах начала и окончания другой поездки.
class TripdateValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
# Check value exists as end_date is optional
if value != nil
parsed_date = Date.parse(value)
# is the start date within the range of anything in the db
trips = Trip.where(['start_date >= ? AND end_date <= ? AND user_id = ?', parsed_date, parsed_date, object.user_id])
# overlapping other trips, aghhh
object.errors[attribute] << 'oh crap' if trips
end
end
end
Дата исходит из поля type = "date", которое работает от jQuery UI Datepicker и содержит формат 2011-01-01. Это доходит до рельсов как 2011-01-30 00:00:00 UTC, которые я не совсем понимаю.
Если я попытаюсь использовать Date.parse() для этого значения, он даст ошибку:
TypeError в TripsController # create
$_ значение должно быть String (задано nil)
Rails.root:
/Users/phil/Sites/travlrapp.com
Трассировка приложения | Рамочная трасса | Полная трассировкаприложение/модели/trip.rb: 29: в
validate_each'
создать "
app/controllers/trips_controller.rb:75:in
приложение/контроллеры/trips_controller.rb: 74: в
`create '
Всякий раз, когда я запускаю запрос, ничего не возвращается. Может ли это быть проблемой формата даты, моя логика сломана, или я делаю что-то действительно глупое? Застрял на этом некоторое время, а google не помогает.
Изменить Люди фокусируются на ошибке Date.parse, но это не основная проблема. Где я застрял в том, что я не понимаю, как делать сравнения дат, когда все находится в совершенно разных форматах.
Я заменил Date.parse() для Chronic.parse(), и теперь я получаю следующие SQL-запросы:
SELECT "trips".* FROM "trips" WHERE (start_date >= '2011-01-26 00:00:00.000000' AND end_date <= '2011-01-26 00:00:00.000000' AND user_id = 19)
Это ничего не возвращает. Датами, которые я тестирую, являются:
начало: 2011-02-17 00: 00: 00.000000 конец: 2011-02-21 00: 00: 00.000000
Видя, как я думаю, даты отформатированы правильно, теперь это больше похоже на логическую проблему. Как я могу проверить пару совпадающих дат > .