如何强制rails SQL缓存清除?

我正在运行rails db:reset db:migrate在我的测试脚本(直接导入和与模型接口)之间的测试之间进行rails db:reset db:migrate ,但是更改不会反映在第一个测试和第二个测试之间。 更具体地说,第一次测试引起的变化并没有像它们应该的那样逆转。

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

我已经看过这个问题,但解决方案没有效果(确实,没有错误,但也没有明显的效果)。

如何强制我的测试脚本清除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 

如何强制DB重置反映在模型中?

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

 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 

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