Rails и Heroku - Rake db:seed заполняет только некоторые базы данных, а не другие?

У меня есть приложение rails, над которым я работаю локально и которое развернуло на heroku. У меня есть много данных, которые нужно просеять, которые хорошо работали локально, с небольшой проблемой, о которой я не особо задумывался. В основном у меня есть несколько таблиц, охватывающих:

  • Особенность,
  • Добавить,
  • Бюджет,
  • ProjectType
  • Промышленность

и т.п.

Когда я создаю / сбрасываю локальную базу данных и запускаю rake db:seed это идеально подходит для каждой базы данных.

Однако, как его WIP, я продолжаю добавлять новые таблицы и запускать seed rake db:seed, и заметил, что там, где он должен был удвоить все просеянные данные (потому что я никогда не очищал данные), он фактически только дублировал эту информацию в таблицах Addon и Feature. Остальные таблицы остались без изменений. Я ничего не думал об этом, пока не начал пытаться запустить heroku, запустив rake db:seed, чтобы заполнить мою производственную базу данных, и заметил, что в журналах он также только заполняет таблицы аддонов и функций и пропускает остальные.

Выдержка из некоторых моих исходных файлов (я сократил с..., поскольку они очень повторяются, но все же):

#Populate the features table
Feature.destroy_all

Feature.create(id: 1, name: 'Contact form')
Feature.create(id: 2, name: 'Blog')
Feature.create(id: 3, name: 'Mailing list signup')
...
...

#Populate the addons table
Addon.destroy_all

Addon.create(id: 1, name: 'Domain registration')
Addon.create(id: 2, name: 'Hosting')
Addon.create(id: 3, name: 'Create content')
...
...

#Populating the industries table
Industry.destroy_all

Industry.create(id: 1, name: 'Accounting')
Industry.create(id: 2, name: 'Airlines')
Industry.create(id: 3, name: 'Alternative Medicine')
...
...

# Populating the budgets table
Budget.destroy_all

Budget.create(id: 1, name: 'Micro', minimum: 250, maximum: 1000)
Budget.create(id: 2, name: 'Simple', minimum: 1000, maximum: 2500)
...
...

Я заметил, что когда я пытаюсь заполнить базу данных heroku с помощью heroku, запустите rake db:seed для всех данных, похоже, будет "откат". Вот выдержка из консоли:

Сначала я бегу heroku run rake db:migrate

    D, [2016-09-01T12:24:31.463009 #3] DEBUG -- :    (1.8ms)  SELECT pg_try_advisory_lock(4467995963834188590);
    D, [2016-09-01T12:24:31.476939 #3] DEBUG -- :   ActiveRecord::SchemaMigration Load (1.9ms)  SELECT "schema_migrations".* FROM "schema_migrations"
    D, [2016-09-01T12:24:31.507280 #3] DEBUG -- :   ActiveRecord::InternalMetadata Load (1.8ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", :environment], ["LIMIT", 1]]
    D, [2016-09-01T12:24:31.518500 #3] DEBUG -- :    (1.7ms)  BEGIN
    D, [2016-09-01T12:24:31.522494 #3] DEBUG -- :    (1.7ms)  COMMIT
    D, [2016-09-01T12:24:31.524504 #3] DEBUG -- :    (1.8ms)  SELECT pg_advisory_unlock(4467995963834188590)

Тогда я бегу грабли heroku run rake db:seed

Для таблиц, где это не работает, кажется, что это делается:

D, [2016-09-01T12:27:28.229540 #3] DEBUG -- :   ActiveRecord::SchemaMigration Load (2.2ms)  SELECT "schema_migrations".* FROM "schema_migrations"
D, [2016-09-01T12:27:28.261528 #3] DEBUG -- :   Budget Load (2.3ms)  SELECT "budgets".* FROM "budgets"
D, [2016-09-01T12:27:28.293954 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.320090 #3] DEBUG -- :    (1.9ms)  ROLLBACK
D, [2016-09-01T12:27:28.322421 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.325418 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.327617 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.331031 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.333423 #3] DEBUG -- :    (1.8ms)  BEGIN
D, [2016-09-01T12:27:28.338379 #3] DEBUG -- :    (2.5ms)  ROLLBACK
D, [2016-09-01T12:27:28.340601 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.344061 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.346208 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.349342 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.353205 #3] DEBUG -- :    (3.4ms)  BEGIN
D, [2016-09-01T12:27:28.358254 #3] DEBUG -- :    (2.5ms)  ROLLBACK
D, [2016-09-01T12:27:28.360392 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.363406 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.365488 #3] DEBUG -- :    (1.6ms)  BEGIN
D, [2016-09-01T12:27:28.367862 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.369869 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.372657 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.378093 #3] DEBUG -- :   Industry Load (2.1ms)  SELECT "industries".* FROM "industries"
D, [2016-09-01T12:27:28.393455 #3] DEBUG -- :    (1.8ms)  BEGIN
D, [2016-09-01T12:27:28.409125 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.411280 #3] DEBUG -- :    (1.6ms)  BEGIN
D, [2016-09-01T12:27:28.414223 #3] DEBUG -- :    (1.6ms)  ROLLBACK
D, [2016-09-01T12:27:28.416244 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.419335 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.421511 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.425412 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.427570 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.431136 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.433536 #3] DEBUG -- :    (2.0ms)  BEGIN
D, [2016-09-01T12:27:28.438208 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.440437 #3] DEBUG -- :    (1.7ms)  BEGIN

И затем, когда он проходит над функциями и надстройками, он, кажется, работает нормально:

D, [2016-09-01T12:27:29.506570 #3] DEBUG -- :   SQL (1.9ms)  INSERT INTO "features" ("id", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["id", 1], ["name", "Contact form"], ["created_at", 2016-09-01 12:27:29 UTC], ["updated_at", 2016-09-01 12:27:29 UTC]]
D, [2016-09-01T12:27:29.509515 #3] DEBUG -- :    (2.5ms)  COMMIT
D, [2016-09-01T12:27:29.512944 #3] DEBUG -- :    (2.2ms)  BEGIN
D, [2016-09-01T12:27:29.516551 #3] DEBUG -- :   SQL (1.9ms)  INSERT INTO "features" ("id", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["id", 2], ["name", "Blog"], ["created_at", 2016-09-01 12:27:29 UTC], ["updated_at", 2016-09-01 12:27:29 UTC]]
D, [2016-09-01T12:27:29.519489 #3] DEBUG -- :    (2.5ms)  COMMIT
D, [2016-09-01T12:27:29.522216 #3] DEBUG -- :    (2.5ms)  BEGIN
D, [2016-09-01T12:27:29.526125 #3] DEBUG -- :   SQL (1.9ms)  INSERT INTO "features" ("id", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["id", 3], ["name", "Mailing list signup"], ["created_at", 2016-09-01 12:27:29 UTC], ["updated_at", 2016-09-01 12:27:29 UTC]]

Я заметил, что из таблиц, аддонов и функций есть has_and_belongs_to_many связь с другими таблицами, в то время как остальные таблицы, которые не работают, имеют belongs_to ассоциация с некоторыми другими таблицами. Не уверен, что это просто совпадение? Спасибо за любую помощь!

2 ответа

Решение

Хорошо, из того, что я могу сказать, это, кажется, проблема с базами данных заполнения belongs_to моделей. Я работал над этим путем:

Вдаваясь в каждую модель и #в belongs_to отношения. Затем я оттолкнул с:

git add .
git commit -m "hashed belongs_to associations"
git push
git push heroku master
heroku run rake db:seed

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

Поскольку Rails 5.1 относится к связанным с объектами объектам по умолчанию (см. https://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html). Возможно, некоторые из принадлежащих вам ассоциаций принадлежащих вам моделей не существуют, поэтому heroku не будет заполнять модели, так как проверка наличия не удалась.

Одно простое решение - пометить ассоциации как необязательные:

class Budget 
   belongs_to :feature, optional: true
   ....
end

Почему бы вам не попробовать использовать find_or_create_by! метод, который сначала проверит, существует ли запись, и создаст ее, только если она не существует.

Feature.find_or_create_by!(name: 'Contact form')

Также он позаботится о проверке, когда вы используете знак взрыва в конце метода. Вы также не должны упоминать идентификатор здесь. Поскольку вы предоставляете идентификатор, это может создать проблему для вас.

Дайте мне знать, если у вас все еще есть проблемы.

Другие вопросы по тегам