Я считаю, что ответ роболов не верен.
Я попытался реализовать это в своем приложении (точно так же, как env: RoR + PostgreSQL), и обнаружил, что когда save
выдается на RoR с объектом, имеющим пустые атрибуты, он пытается выполнить INSERT на база данных с указанием, что все значения должны быть установлены в NULL. Проблема в том, как PostgreSQL обрабатывает значения NULL: в этом случае будет создана новая строка, но все значения будут пустыми, то есть DEFAULT будет проигнорировано. Если save
записывает только атрибуты оператора INSERT, заполненные в RoR, это будет работать нормально.
Другими словами, и фокусируясь только на атрибутах type
и customer_no
, упомянутых выше, PostgreSQL ведет себя так:
СИТУАЦИЯ 1:
INSERT INTO accounts_customers (type, customer_no) VALUES (NULL, NULL);
(так работает Rails save
)
Результат: новая строка с пустым type
и пустым customer_no
СИТУАЦИЯ 2:
INSERT INTO accounts_customers (type) VALUES (NULL);
Результат: новая строка с пустыми type
и customer_no
, заполненными NEXTVAL
последовательности
У меня есть нить об этом, проверьте это по адресу:
Ruby on Rails + PostgreSQL: использование пользовательских последовательностей