Базы данных 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
...