Activerecord Model.table_exists?没有给出正确的结果

时间:2018-08-26 19:23:53

标签: ruby-on-rails rails-activerecord

在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

2 个答案:

答案 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!的步骤来重新加载所有内容。