【发布时间】:2019-01-28 04:50:59
【问题描述】:
ActiveRecord::Base.configurations 或establish_connection() 是否有一个参数可以强制确保无法写入数据库? (如果有什么不同,那就是 Heroku Postgres 数据库)
辅助 Sinatra 应用程序(使用 ActiveRecord 5.2)需要严格对主要应用程序使用的 Heroku Postgres 数据库进行只读访问...例如,即使代码错误意外尝试编写改变,我们需要它失败。
几个 SO 线程中的建议是定义一个 readonly?方法如下图。
它几乎可以工作...除了一个重要的例外...
虽然它确实阻止了保存或更新属性,但它不会阻止更新列的写入。
APP_DB_HASH = {
"appdb"=>
{ "adapter"=>"postgresql",
"encoding" => "unicode",
"pool" => 5,
"url"=> ENV["APP_DATABASE_URL"] },
ActiveRecord::Base.configurations["appdb"] = {
:adapter => APP_DB_HASH["appdb"]["adapter"],
:encoding => APP_DB_HASH["appdb"]["encoding"],
:database => uri.path.gsub('/',''),
:username => uri.user,
:password => uri.password,
:port => uri.port,
:host => uri.host
}
class AppBase < ActiveRecord::Base
self.abstract_class = true
establish_connection configurations["appdb"]
# THIS DOES NOT PREVENT update_column FROM WRITING TO DATABASE!
def readonly?
true
end
end
class MyModel << AppBase
...
end
结果:
> rec = MyModel.first.foo
# false
> rec.update_attributes foo: true
# GOOD: exception thrown, prevents write
> rec.foo = true
> rec.save
# GOOD: exception thrown, prevents write
> rec.update_column :foo, true
# FAIL: THE 'READONLY" DATABASE GETS WRITTEN
【问题讨论】:
标签: activerecord readonly