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

У меня есть проект 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 Ответ

0 голосов
/ 27 января 2011

Я использовал немного другой подход, но он работал последовательно для меня. Вместо того чтобы использовать файл 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
...
...