Rails добавить индекс по году созданного - PullRequest
1 голос
/ 05 февраля 2020

В моем приложении на 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 каждый раз, когда создается новый тикет. Это работает большую часть времени. Но это стало бы проблемой, если два билета создаются очень близко друг к другу.

Что мне делать? Я думаю, что пользовательская проверка может также потерпеть неудачу в зависимости от точного времени.

Спасибо!

1 Ответ

2 голосов
/ 05 февраля 2020

Вы пытаетесь использовать синтаксис Ruby, когда вы должны использовать синтаксис PostgreSQL. Вызов created_at.date будет работать с Ruby ActiveSupport::TimeWithZone объектом, но аргумент, который вы передаете add_index, будет оцениваться Postgres, а не Ruby. Так что это сбой, потому что, Postgres, created_at.date здесь недопустимый синтаксис. Поэтому, чтобы исправить это, вам просто нужно переключиться на синтаксис PostgreSQL.

Я думаю, вы могли бы достичь желаемого с помощью чего-то вроде этого:

add_index :tickets, "number, EXTRACT(YEAR FROM created_at)", unique: true, name: 'index_tickets_uniqueness_on_year'.

Не проверено, но оно должно Работа. Больше информации о функции ЭКСТРАКТ и других Postgres Дата / Время здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...