ruby-on-rails - 如何强制清除 Rails SQL 缓存?

标签 ruby-on-rails ruby caching

我正在测试脚本(直接导入模型并与模型交互)中的测试之间运行 rails db:reset db:migrate,但更改不会在第一个测试和第二次测试。更具体地说,第一次测试引起的变化没有按应有的方式逆转。

当我从外部(从 shell)连接到数据库时,我观察到该命令已生效。

我已经看过this question但该解决方案没有效果(从字面上看,没有错误,但也没有明显的效果)。

如何强制我的测试脚本清除 SQLite 状态的内存缓存?


重现问题的完整步骤。

  1. 创建一个新的 Rails 应用程序。

    rails new MWE
    
  2. 将以下内容放入db/schema.rb

    ActiveRecord::Schema.define(version: 20140408213603) do
        create_table "users", force: true do |t|
        t.string   "username"
      end
    end
    
  3. 将以下内容放入 db/seed.rb 中。

    User.create(username: 'user1')
    User.create(username: 'user2')
    User.create(username: 'user3')
    
  4. 将以下内容放入 Gemfile 中。

    source 'https://rubygems.org' 
    gem 'rails', '4.0.0' 
    gem 'sqlite3' 
    gem 'protected_attributes' 
    
  5. 将以下内容放入名为 app/models/user.rb 的文件中。

    class User < ActiveRecord::Base
      attr_accessible :username
    end
    
  6. 运行以下命令。

    bundle install
    rake db:reset
    
  7. 将以下内容放入名为 MWE.rb 的文件中

    load 'config/application.rb'
    load 'config/environment.rb'
    load 'app/models/user.rb'
    
    # Mimic the unsafe call in the source code
    system("bundle exec rake db:reset")
    puts User.count
    User.destroy_all("username = 'user3'")
    puts User.count
    system("bundle exec rake db:reset")
    puts User.count
    User.destroy_all("username = 'user3'")
    puts User.count
    
  8. 运行文件并观察实际输出

    $ ruby MWE.rb
    -- create_table("users", {:force=>true})
       -> 0.0362s
    -- initialize_schema_migrations_table()
       -> 0.0248s
    3
    2
    -- create_table("users", {:force=>true})
       -> 0.0809s
    -- initialize_schema_migrations_table()
       -> 0.0490s
    2
    2
    

期望的输出

    -- create_table("users", {:force=>true})
       -> 0.0362s
    -- initialize_schema_migrations_table()
       -> 0.0248s
    3
    2
    -- create_table("users", {:force=>true})
       -> 0.0809s
    -- initialize_schema_migrations_table()
       -> 0.0490s
    3
    2

如何强制数据库重置反射(reflect)在模型中?

最佳答案

您所需要做的就是重新建立数据库连接。尝试:

system("bundle exec rake db:reset")
puts User.count
User.destroy_all("username = 'user3'")
puts User.count

system("bundle exec rake db:reset")
ActiveRecord::Base.clear_all_connections!
puts User.count
User.destroy_all("username = 'user3'")
puts User.count

主要问题是:为什么需要这样做?我非常确定有更好的方法来实现您想要的。

关于ruby-on-rails - 如何强制清除 Rails SQL 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319575/

相关文章:

java - Play Framework : Store connections after onStart?

linux - 找不到 drop_caches 文件也不允许我创建一个文件(具有 root 访问权限)

ruby-on-rails - Rails : Absolutely stumped with delayed_job. 没有在任何地方接收参数

mysql - Rails - 更改备用新数据列的默认值

ruby-on-rails - 我如何用 rspec 测试这个?

ruby - Matrix.rb 没有这样的文件 Ruby 1.9.2

ruby-on-rails - rails 模型 : how would you create a pre-defined set of attributes?

ruby-on-rails - Sprockets 无法找到从 rails 4.2 升级到 rails 5.0 的 .es6 文件

ruby-on-rails - 从关联中序列化不可变数据是个好主意吗?

java - 如何等待数据缓存更新,同时不影响其他缓存调用