Ruby on Rails+PostgreSQL: использование пользовательских последовательностей

Скажем, у меня есть модель под названием Transaction, которая имеет атрибут :transaction_code. Я хочу, чтобы этот атрибут автоматически заполнялся порядковым номером, который может отличаться от id (например, транзакция с id=1 может иметь transaction_code=1000).

Я попытался создать последовательность в postgres, а затем сделать значение по умолчанию для столбца transaction_code столбцом nextval этой последовательности. Дело в том, что если я не присваиваю никакого значения @transaction.transaction_code на RoR, когда я выпускаю @transaction. save на RoR, он пытается выполнить следующий SQL:

INSERT INTO transactions (transaction_code) VALUES (NULL);

Что это делает, так это создает новую строку в таблице Transactions, с transaction_code как NULL, вместо того, чтобы вычислить nextval последовательности и вставить его в соответствующий столбец. Таким образом, как я выяснил, если вы указываете NULL в postgres, он предполагает, что вы действительно хотите вставить NULL в этот столбец, независимо от того, что он имеет значение по умолчанию (я пришел из ORACLE, который имеет другое поведение).

Я открыт для любых решений по этому вопросу, либо если это делается в базе данных, либо в RoR:

  • либо есть способ исключить атрибуты из ActiveRecord's save
  • либо есть способ изменить значение столбца перед вставкой с помощью триггера
  • либо есть способ генерировать эти порядковые номера в RoR
  • либо любой другой способ, лишь бы он работал :-)

Заранее спасибо.

8
задан Ricardo Melo 19 October 2011 в 11:40
поделиться