Вы можете использовать модуль dateutil, который имеет более дружественный объект относительной дельты.
import dateutil
import datetime
alpha = datetime.datetime(2012, 1, 16, 6, 0)
beta = datetime.datetime(2012, 1, 18, 10, 42, 57, 230301)
delta = dateutil.relativedelta(beta, alpha)
это дает вам объектную дельту, которая выглядит как
>>> delta
relativedelta(days=+2, hours=+4, minutes=+42, seconds=+57, microseconds=+230301)
Затем вы можете сделать
print('turnaround %i hrs %i mins %i secs' % (delta.days * 24 + delta.hours, delta.minutes, delta.seconds)
)
Rails придерживается некоторых соглашений о том, что обеспечение целостности данных должно выполняться в приложении, а не в базе данных.
Например, Rails даже поддерживает некоторые конструкции баз данных, которые не могут использовать внешние ключи , такие как полиморфные ассоциации.
По сути, соглашения Rails рассматривают базу данных как статическое устройство хранения данных, а не как активную СУБД. Rails 2.0 - это , наконец, , поддерживающий некоторые более реалистичные функции баз данных SQL. Неудивительно, что в результате разработка с Rails станет более сложной, чем в версии 1.0.
Он действительно создает столбец customer_id
(очевидно). Однако по большей части Rails верит в обеспечение ограничений и проверок на уровне приложения , а не на уровне базы данных; поэтому столбцы по умолчанию в Rails могут содержать значения NULL
, даже если у вас есть validates_presence_of
или что-то в этом роде. По мнению разработчиков Rails, такие ограничения должны обрабатываться приложением, , а не базой данных.
Проработав какое-то время над этой проблемой, я не думаю, что это часть основной философии Rails, что внешние ключи не должны принудительно использоваться базой данных.
Проверки и проверки на уровне приложения предназначены для обеспечения простых, быстрых, удобочитаемых (например, сообщений об ошибках) проверок, которые работают в 99,99% случаев. Если вашему приложению требуется больше, чем это, вы должны использовать ограничения уровня базы данных.
Я думаю, что эта «философия» эволюционировала из-за использованных исходных структур тестирования: внешние ключи просто оказались огромной проблемой при использовании фикстур. Это как когда «ошибка» становится «особенностью», потому что ее никто не исправляет. (Если я неправильно помню историю, кто-нибудь меня поправит.)
Как минимум, в сообществе Rails растет движение за обеспечение целостности базы данных. Прочтите это сообщение в блоге за последний месяц. Она даже ссылается на некоторые плагины, которые помогают справляться с ошибками (и еще одно сообщение в блоге, где есть ссылки на другие плагины). Сделайте еще несколько поисков в Google; Я видел и другие плагины, которые добавляют поддержку миграции для создания внешних ключей.
Теперь то, что является частью основной философии Rails: не беспокойтесь о вещах, если вам действительно не нужно . Для многих веб-приложений вполне нормально, если небольшой (возможно, крошечный) процент записей содержит недопустимые данные. Страницы, которые могут быть затронуты, могут просматриваться очень редко, либо ошибка уже может быть обработана изящно. А может быть дешевле (например, Cold Hard Cash), чтобы решать проблемы вручную в течение следующих 6 месяцев по мере роста приложения, чем сейчас тратить ресурсы на планирование ресурсов разработки для каждого непредвиденного случая. По сути, если в ваших сценариях использования это не кажется важным, и это может быть вызвано только состоянием гонки, которое может произойти 1/10000000 запросов ... ну, стоит ли оно того?
Итак, мой прогноз таков. эти инструменты появятся, чтобы лучше справляться со всей ситуацией по умолчанию, и в конечном итоге они будут объединены в Rails 3. А пока, если вашему приложению это действительно нужно, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего, что вы не сможете преодолеть с помощью заглушек и заглушек. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)
и это действительно может быть вызвано только состоянием гонки, которое может произойти 1/10000000 запросов ... ну, это того стоит?Итак, я предсказываю, что появятся инструменты, которые по умолчанию будут лучше справляться со всей ситуацией, и в конечном итоге они будут объединены в Rails 3. А пока, если вашему приложению это действительно нужно, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего, что вы не сможете преодолеть с помощью заглушек и заглушек. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)
и это действительно может быть вызвано только состоянием гонки, которое может произойти 1/10000000 запросов ... ну, это того стоит?Итак, я предсказываю, что появятся инструменты, которые по умолчанию будут лучше справляться со всей ситуацией, и в конечном итоге они будут объединены в Rails 3. А пока, если вашему приложению это действительно нужно, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего, что вы не сможете преодолеть с помощью заглушек и заглушек. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)
не обходиться с моками и заглушками. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :) не обходиться с моками и заглушками. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)Одна ошибка, которую делают многие люди, - это путают миграции с моделью. Миграции просто изменяют базу данных и не имеют ничего общего с определенными вами моделями. В результате этой путаницы многие плагины внешнего ключа пытаются объединить модель с миграциями и делают слишком много волшебных вещей.
Для миграции я бы использовал http://github.com/matthuhiggins/ иностранец / дерево / хозяин . Вам не нужно менять свои модели, чтобы внешние ключи работали с Rails.