Засеянные значения ключа базы данных конфликтуют с фабричным ботом create / build - PullRequest
0 голосов
/ 03 мая 2018

Наша база данных rails предварительно заполнена некоторыми данными для некоторых из наших статических моделей. Например, у нас есть модель DocumentType, которая заполняется / обновляется через db/seeds.rb. Пользователи не могут изменять эту модель.

Однако, похоже, это не очень хорошо работает с factory_bot; когда я пытаюсь:

create(:document_type)

Я получаю сообщение об ошибке:

ActiveRecord :: RecordNotUnique: PG :: UniqueViolation: ОШИБКА: двойное значение ключа нарушает ограничение уникальности «document_types_pkey» ДЕТАЛИ: Ключ (id) = (1) уже существует.

Каждый раз, когда я запускаю тест, эта ошибка возникает, но ключ (id), который пытается сохранить приращения. Затем, в конце концов, тест проходит, когда он выходит за пределы диапазона засеваемых данных.

Что я не понимаю, так это то, почему factory_bot фактически устанавливает значение id и не позволяет базе данных назначать его при сохранении записи.

document_type factory

FactoryBot.define do
  factory :document_type do
    label 'Alien Spacecraft License'
    description 'It should be obvious, I think'
    created_at { Time.now - 30.days }
    updated_at { Time.now - 30.days }
  end
end

попытки исправить

Я попытался создать файл фикстуры, который имитирует именно то, что находится в файле seed.rb - когда я это делаю, factory_bot учитывает значения id, установленные в фикстуре. Но это вызывает много дублирующих усилий (я должен синхронизировать семена с приборами).

Я смотрел на использование приборов для заполнения базы данных, но, к сожалению, в нашем случае мы используем жестко запрограммированные идентификаторы в начальных данных для вставки / обновления ... поэтому не кажется хорошим вариантом заполнения .

Интересно, есть ли у кого-нибудь идеи? Спасибо!

1 Ответ

0 голосов
/ 05 мая 2018

Возможно, попытайтесь упорядочить ваш document_type фабричный идентификатор, чтобы начать приращение после последнего идентификатора вашего семени

FactoryBot.define do
  factory :document_type do
    sequence(:id) {|n| n + 30 } #i.e n + last id known in seed
  end
end
...