В моем приложении на Rails есть билет на модель. Его created_at
поле ActiveSupport::TimeWithZone
. Он также имеет поле number
типа integer. Поле number
не является первичным ключом. Первичный ключ - это UUID.
В любой год у меня не может быть 2 билетов с одинаковым номером. Например, в 2020 году запрещено иметь 2 билета с номером 15. Однако разрешено, чтобы 2 билета имели одинаковый номер, если они были созданы в разные годы. Например, билет, созданный в 2019 году, имеет номер 15, а билет, созданный в 2020 году, имеет номер 15 - это нормально.
Итак, я пытаюсь добавить индекс в таблицу заявок на числа и год созданного_атеста и требую, чтобы индекс был уникальным:
class AddIndexToTickets < ActiveRecord::Migration[5.2]
def change
add_index :tickets, "number,(created_at.year)", unique: true, name: 'index_tickets_uniqueness'
end
end
Это приводит к ошибке
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "created_at"
LINE 1: ..." ON "tickets" (number,(created_at...
Причина для этого состоит в том, чтобы избежать проблем параллелизма. В моих кодах у меня есть механизмы для автоматического увеличения number
каждый раз, когда создается новый тикет. Это работает большую часть времени. Но это стало бы проблемой, если два билета создаются очень близко друг к другу.
Что мне делать? Я думаю, что пользовательская проверка может также потерпеть неудачу в зависимости от точного времени.
Спасибо!