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 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
。谢谢您的帮助!