Базы данных Rails с файлами yml иногда удаляют и повторно добавляют существующие записи, иногда нет. Что дает?

У меня есть проект rails с семенами, которые выполняются с использованием rake db:seed. Это, в свою очередь, загружает файлы RB в каталог db/seed, который, в свою очередь, выполняет что-то вроде этого:

Fixtures.create_fixtures("db/seeds","projects")

Есть проект.yml в виде

project_name1:
  property: value

project_name2:
  property: value

В таблице проектов SQL есть существующие записи проектов. Некоторые из них в файле YML являются новыми, а другие нет. Я потратил несколько дней, работая с семенами БД, и это изменило бы некоторые идентификаторы проекта, но не другие. Но он не будет дублировать те, для которых он не изменил идентификатор, даже если все они находятся в файле YML. Таким образом, с некоторыми записями все было в порядке, другие удалили и добавили с новым идентификатором (или просто обновили идентификатор, не зная, какая именно).

Затем вдруг это перестало делать это. Я удаляю и перезагружаю свою базу данных в обычном режиме (используя sql-дампы, чтобы вернуться в чистое, неизмененное состояние), но семена БД работают отлично, оставляя только существующие данные в покое и только добавляя новые данные (даже если все они находятся в файле yml) не касаясь существующих идентификаторов.

Затем вдруг снова, он начал делать это снова. Я потратил две недели на поиски в Google что-нибудь о семенах, существующем заполнении данных и обновлении идентификаторов, но не повезло.

Любая помощь, конечно, ценится.

1 ответ

Я использовал немного другой подход, но он работал последовательно для меня. Вместо того чтобы использовать файл project.yml, я загрузил свои начальные данные в текстовый файл с разделителями каналов, который я поместил в созданную мной папку db/seed_data/, а затем использовал find_or_create_by для загрузки данных, чтобы они не перезаписывали существующие данные.

seed.rb

  directory = "db/seed_data/"

# Pre-load 
  path = File.join(directory, "projects.txt")
  open(path) do |projects|
    projects.read.each_line do |project|
      name, owner = school.chomp.split("|")
      Project.find_or_create_by_name_and_owner!(name, owner)
    end
  end

----------------

projects.txt

Project A|admin
Project B|user1
Project C|admin
...
Другие вопросы по тегам