使用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等(从中继承。

可打字的模型

class TypeTable < ApplicationRecord
validates :title, presence: true, uniqueness: true
end

其他设备类型型号

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

注意:我知道变通办法,我的应用程序也能正常工作,但我依赖于一个特定的分支,该分支拥有所有注释代码第一次构建我想要删除的数据库时需要。

任何帮助都表示感谢。

在加载模型定义时访问数据库是一个非常糟糕的主意。不要那样做。

相反,考虑使用一个只在第一次需要时检索值的类方法:

def self.garmin_id
@garmin_id ||= find_by(title: "Garmin").id
end

就我个人而言,我强烈反对这种持久性——最好花一个查询来为每个需要它的请求重新检索它——但这更多的是设计判断的问题。

相关内容

  • 没有找到相关文章

最新更新