Использование 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

Лично я бы категорически не одобрял даже такую ​​настойчивость - лучше потратить один запрос, восстанавливая его заново для каждого запроса, который в этом нуждается - но это скорее вопрос оценки проекта.

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