Повторяющиеся записи базы данных
Быстрый вопрос о повторяющихся записях в БД.
Скажем, у меня есть пользователи, публикующие свои поездки на платформе. Теперь пользователь может сказать, что эти поездки повторяются - он / она совершает эту поездку каждый вторник и четверг.
Чтобы было еще интереснее, скажите, что к каждой поездке прикреплены запросы, которые могут делать другие пользователи. И они могут сделать эти Запросы для каждой повторяющейся поездки.
Любые идеи о том, как бы я справился с делом, как этот на заднем плане? Использование Rails и Postgres.
Заранее спасибо!
2 ответа
User
has_many :trips
Trip
belongs_to :user
has_many :requests
Request
belongs_to :user
belongs_to :trip
добавлять recurring_start
а также recurring_end
атрибуты на Trip
и, возможно, recur
атрибут на Request
, Я не знаю, что вам нужно создавать какие-либо дополнительные записи для каждой поездки, не так ли?
Если это так, вы хотите, чтобы ваша бизнес-логика справилась с этим. Что-то вроде Sidekiq с объектом Query, который выбирает поездки, которые должны быть повторены, и создает новую поездку с (например) обновленными датами начала и окончания…
class Trip < ApplicationModel
scope :recurring, -> { where(recur: true) }
scope :due_for_recurrence, -> { recurring.where(Trip.arel_table[:end_date].lt(Time.now)) }
end
Вы можете использовать что-то вроде DeepCloneable, если вы хотите автоматически клонировать / дублировать связанные записи.
Поскольку в каждой поездке могут быть разные запросы, всем им нужен собственный индивидуальный идентификатор. Было бы целесообразно относиться к ним точно так же, как к неповторяющимся поездкам, за исключением одной ситуации: когда создатель поездок хочет отредактировать или удалить все экземпляры повторяющейся поездки. Для этого может потребоваться создать дополнительную таблицу для повторяющихся поездок с отношением один-ко-многим от идентификаторов повторяющихся поездок до идентификаторов поездок, и позволить пользователям иметь идентификаторы повторяющихся поездок, а также идентификаторы поездок. Таким образом, пользовательский интерфейс может отображать два вида логически, и они не будут потеряны.
Просто убедитесь, что каждый раз, когда поездка редактируется или удаляется, таблица повторяющихся поездок обновляется. Этого можно достичь, просто запретив редактирование или удаление поездок, являющихся частью повторяющейся поездки, или сделав в таблице поездок необязательный идентификатор повторяющейся поездки.