tgoop.com/itextrapolation/732
Last Update:
Опишу штуку, от которой я сильно прусь и которая была нами реализована.
В рельсах почти во всех таблицах в базе есть два поля updated_at
и created_at
с соответствующими значениями. Поля полезные, информативные. Однажды я задался целью держать эти поля актуальными, ну там бизнес-логика такого требовала. Чтобы когда создавался новый коментарий у задачи, чтобы updated_at
поле обновлялось текущей датой. Вроде бы, задача для рельсовика вообще плёвая, toch: true
дописал в нужном месте и делов-то.
Потом началось протекание абстракций. Сначала захотелось рекурсивного обновления. Чтобы у таблицы-дедушки обновлялось поле, если внук создаётся. Такой вот рекурсивный touch: true
, который вообще-то так и работает. Во-вторых, промежуточные (torugh
) таблицы игнорируются фреймворком. Ну вот есть у тебя companies
, projects
, comments
и ты создаёшь companies.comments.create
и хотелось бы, чтобы и у соответствующего и проекта и компании updated_at
обновлялся, но нет. Ещё каждое обновление updatedat в каждой таблице — это отдельный запрос. В общем, фигня, как всегда.
И мы тогда добавили две вещи.
1. Значение по-умолчанию в таблице `createdat поставили в CURRENT_TIMESTAMP
2. Триггер таблицам, которые по всем foreignkey проходятся и там UPDATE updated_at
делают соовтетсвующим записям в соседних таблицах.
Получилась красота неимоверная. Теперь никаких touch: true
, а все записи в базе всегда в актуальных состояниях даже когда данные прямым sql-запросом обновляются.
BY Экстраполяция IT
Share with your friend now:
tgoop.com/itextrapolation/732