Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何强制清除rails SQL缓存?_Ruby On Rails_Ruby_Caching - Fatal编程技术网

Ruby on rails 如何强制清除rails SQL缓存?

Ruby on rails 如何强制清除rails SQL缓存?,ruby-on-rails,ruby,caching,Ruby On Rails,Ruby,Caching,我在测试脚本(直接导入模型并与模型交互)中的测试之间运行rails db:reset db:migrate,但是在第一个测试和第二个测试之间不会反映出更改。更具体地说,第一次测试引起的变化不会像应该的那样逆转 当我从外部(从shell)连接到数据库时,我观察到命令已经生效 我已经看过了,但是解决方案没有效果(确切地说,没有错误,但也没有明显的效果) 如何强制测试脚本清除sqlite状态的内存缓存 重现问题的完整步骤。 创建一个新的rails应用程序 rails new MWE 将以下内容放

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

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

我已经看过了,但是解决方案没有效果(确切地说,没有错误,但也没有明显的效果)

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


重现问题的完整步骤。
  • 创建一个新的rails应用程序

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

    ActiveRecord::Schema.define(version: 20140408213603) do
        create_table "users", force: true do |t|
        t.string   "username"
      end
    end
    
    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
    
  • 将以下内容放入
    db/seed.rb

    User.create(username: 'user1')
    User.create(username: 'user2')
    User.create(username: 'user3')
    
    class User < ActiveRecord::Base
      attr_accessible :username
    end
    
  • 将以下内容放入
    GEM文件

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

    User.create(username: 'user1')
    User.create(username: 'user2')
    User.create(username: 'user3')
    
    class User < ActiveRecord::Base
      attr_accessible :username
    end
    
  • 将以下内容放入名为
    MWE.rb的文件中

    ActiveRecord::Schema.define(version: 20140408213603) do
        create_table "users", force: true do |t|
        t.string   "username"
      end
    end
    
    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
    
  • 运行文件并观察实际输出

    $ 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
    
  • 期望输出
    如何强制在模型中反映数据库重置?

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

    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
    

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

    您能发布一些代码,让我们重现这个问题吗?@Broisasze,我正在研究。为此创建一个MWE是非常重要的,所以我想我应该在完成MWE之前发布,以防有人已经看到这个问题。@BroiSatse,完整的MWE发布。请注意,我是ruby/rails的新手,所以如果你知道一种使这个MWE更小的方法,也请对此发表评论。我正在为我正在教的一个班级写一个自动签名器。要评分的作业之一是SQL注入,由于有许多方法可以错误地编写这种注入,我想在运行不同学生提交的作业之间重置数据库的状态。@merlin2011-听起来很酷。:)所以他们会在网站上写一些代码,你想把它作为迁移来运行吗?是的,这是一般的想法。不幸的是,该项目的某些部分依赖于Ruby,Ruby并不是我的母语嗯,我仍然得到
    未定义的方法
    清除所有连接!'即使gem文件中有
    gem activerecord
    。谢谢您的帮助!