database_tasks: false 在 Rails 7.1 中不起作用

问题描述 投票:0回答:1

我在

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
来限制对外部数据库的写入操作。

ruby-on-rails postgresql rails-activerecord
1个回答
0
投票

错误信息告诉数据库的配置中数据库的

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}" %>
© www.soinside.com 2019 - 2024. All rights reserved.