我在
database.yml
中配置了 2 个只读副本,我想避免 Ruby on Rails 应用程序中的任何写入操作。
设置
database_tasks: false
时引发以下异常:
/.rvm/gems/ruby-3.2.2/gems/activerecord-7.1.1/lib/active_record/railtie.rb:151:in `block (3 levels) in <class:Railtie>':
undefined method `name' for nil:NilClass (NoMethodError)
in db_config.name
database_task
是否已弃用或版本升级后出现一些错误?
数据库.yml
service_read_replica_defaults: &service_read_replica_defaults
adapter: postgresql
username: root
password: password
host: localhost
port: 5432
database: <% ("service_#{Rails.env}") %>
database_tasks: false
production:
service_read_replica:
<<: *service_read_replica_defaults
patient_read_replica:
<<: *patient_read_replica_defaults
我想以只读访问权限连接两个外部数据库。我想使用
database_task: false
来限制对外部数据库的写入操作。
错误信息告诉数据库的配置中数据库的
name
是nil
。
我认为问题在于如何在
database
中配置 database.yml
。目前,它看起来像这样
database: <% ("service_#{Rails.env}") %>
但是以
<%
开头的 ERB 语句仅评估代码,但评估后不会将响应插入到文档中。您需要将此行更改为:
database: <%= ("service_#{Rails.env}") %>
请注意 ERB 声明开头的
<%=
。
此外,
database
配置是在默认块中设置的,这意味着使用这些默认值的所有数据库配置都是相同的。
从您的问题来看,尚不完全清楚您如何重新使用这些默认值。我希望至少两个副本共享相同的默认值,但应该具有不同的
database
配置以使用不同的数据库。因此,我建议为所有副本显式设置 database
,而不仅仅是在默认情况下设置一次。例如,像这样:
read_replica_defaults: &read_replica_defaults
adapter: postgresql
username: root
password: password
host: localhost
port: 5432
database_tasks: false
production:
service_read_replica:
<<: *read_replica_defaults
database: <%= "service_read_replica_#{Rails.env}" %>
patient_read_replica:
<<: *read_replica_defaults
database: <%= "patient_read_replica_#{Rails.env}" %>