Activerecord Model.table_exists? не дает правильных результатов - PullRequest
0 голосов
/ 26 августа 2018

При создании реальной таблицы базы данных в консоли 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
Рельсы 5.2.1

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Полагаю, это вещь из кеша.Я не мог сказать, если ошибка или нет, я не очень хорошо разбираюсь во внутренностях рельсов, но я догадываюсь, что так задумано.Это даже не распространенный вариант создания таблиц из консоли.

Вы можете пропустить выход> ввести шаги, вызывающие reload! на консоли, чтобы перезагрузить все.

0 голосов
/ 26 августа 2018

ActiveRecord::ModelSchema::ClassMethods#table_exists? - это оболочка для ActiveRecord::ConnectionAdapters::SchemaCache#data_source_exists?.

Как следует из названия, это кэш, который, вероятно, заполняется при запуске приложения Rails.Если вы измените схему базы данных, старая схема все равно будет кэширована (возможно, ошибка или отсутствующая функция).Вы можете перезагрузить кэш схемы User с помощью User.reload_schema_from_cache или, возможно, connection.schema_cache.clear_data_source_cache(Users.table_name.

...