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')
Также он позаботится о проверке, когда вы используете знак взрыва в конце метода. Вы также не должны упоминать идентификатор здесь. Поскольку вы предоставляете идентификатор, это может создать проблему для вас.
Дайте мне знать, если у вас все еще есть проблемы.