在Rails控制台中创建实际的数据库表时,User.table_exists?
不能给我正确的结果。
但是,当我查看ActiveRecord::Base.connection.tables
时,它表明该表存在。我必须退出rails console
并返回,然后User.table_exists?
给我正确的值。是否正在进行一些缓存? Rails 5.2.1中的错误?还是我错过了什么?
要复制的代码:
在终端/ bash
rails generate model User name:string
rails console
在铁路控制台
User.table_exists? => false
ActiveRecord::Base.connection.tables => []
ActiveRecord::Migration[5.2].create_table :users =>
-- create_table(:users)
(0.1ms) SELECT sqlite_version(*)
(1.5ms) CREATE TABLE "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL)
ActiveRecord::Base.connection.tables => ["users"]
User.table_exists? => false
exit
在终端/ bash
rails console
在铁路控制台
User.table_exists? => true
使用:
Ruby 2.5.0
Rails 5.2.1
答案 0 :(得分:0)
ActiveRecord::ModelSchema::ClassMethods#table_exists?
是ActiveRecord::ConnectionAdapters::SchemaCache#data_source_exists?
的包装。
顾名思义,这是一个缓存,可能在Rails应用启动时填充。如果您修改数据库架构,则仍将缓存旧架构(可以说是错误或缺少功能)。您可以使用User.reload_schema_from_cache
或可能的connection.schema_cache.clear_data_source_cache(Users.table_name
重新加载User
的模式缓存。
答案 1 :(得分:0)
我想这是一个缓存的东西。我无法确定是否有错误,我对rails内部知识不多,但我猜这是设计使然。从控制台内部创建表甚至不是一个常见的用例。
您可以跳过出口>在控制台上输入调用reload!
的步骤来重新加载所有内容。