Использование STI не удается перенести базу данных
Некоторое время работал над этой конкретной проблемой и думал, что пришло время обратиться за помощью. Я посмотрел на следующие ссылки, но не повезло
PG неопределенная ошибка отношения пользователей не существует
https://github.com/rails/rails/issues/3279
И моя проблема несколько похожа на эту https://github.com/rails/rails/issues/6470 но не совсем так.
У меня есть класс с именем type_tables, который является базовым классом для STI, вот схема для STI
create_table "type_tables", force: :cascade do |t|
t.string "title"
t.string "desc"
t.string "type"
t.string "uom"
t.index ["title"], name: "index_type_tables_on_title"
t.index ["type"], name: "index_type_tables_on_type"
end
Теперь эта таблица типов является только базовым классом в моем проекте, и другие типы, такие как device_type, certificate_type и т. Д., Наследуются от него.
Модель для type_table
class TypeTable < ApplicationRecord
validates :title, presence: true, uniqueness: true
end
Другая модель device_type
class DeviceType < TypeTable
has_many :certificates
#this is where the error originates
GARMIN_ID = find_by(title: "Garmin").id
#when i use some constant value rails successfully executes the
db:create task in my rake file
GARMIN_ID = 22
end
Теперь интересный момент, он показывает это поведение только в первый раз, когда в моей базе данных Postgres нет таблицы. После успешного создания и переноса схемы приложения и наличия таблиц эта строка будет работать каждый раз.
GARMIN_ID = find_by(title: "Garmin").id
Моя идея состоит в том, что, поскольку он пытается найти столбец в отношении type_tables, а отношение не существует, он выдает ошибку "нет отношения существует". Хотя ошибка, которую вы видите на консоли
2018-08-07 02:24:49.281 UTC [69] FATAL: database "myappdb" does not
exist
mlcot_api | /usr/local/bundle/gems/activerecord-5.1.3/lib/active_record/connection_adapters/postgresql_adapter.rb:699:in
`rescue in connect': FATAL: database "myappdb" does not exist
(ActiveRecord::NoDatabaseError)
Когда я создаю БД вручную, используя
docker-compose run api rake db:create
А затем запустить Docker-составить я получаю
ERROR: relation "type_tables" does not exist at character 566
/usr/local/bundle/gems/activerecord- `async_exec': PG::UndefinedTable:
ERROR: relation "type_tables" does not exist
(ActiveRecord::StatementInvalid)
WHERE a.attrelid = '"type_tables"'::regclass
ПРИМЕЧАНИЕ: я знаю обходной путь, и мое приложение работает, но у меня есть зависимость от конкретной ветки, в которой есть весь закомментированный код, необходимый для создания моей базы данных в первый раз, который я хочу удалить.
Любая помощь приветствуется и спасибо заранее.
1 ответ
Это очень плохая идея для доступа к вашей базе данных при загрузке определений моделей. Не делай этого.
Вместо этого рассмотрите возможность использования метода класса, который получает значение только в первый раз, когда это необходимо:
def self.garmin_id
@garmin_id ||= find_by(title: "Garmin").id
end
Лично я бы категорически не одобрял даже такую настойчивость - лучше потратить один запрос, восстанавливая его заново для каждого запроса, который в этом нуждается - но это скорее вопрос оценки проекта.