`connects_to` 只能在 ActiveRecord::Base 或抽象 类 上调用

`connects_to` can only be called on ActiveRecord::Base or abstract classes

在我的 Rails 应用程序 Ruby 中,我想从第二个非标准(不符合 Rails 约定)数据库访问一些数据。 Rails 上的 Ruby 应用程序只能读取,不能写入该数据库。

config/database.yaml中我这样声明:

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

wn:
  <<: *default
  database: ~/dev/wn/wn.db

然后,我将以下 class 添加到 app/models 目录:

class CiHarvestRecord < ActiveRecord::Base
  self.table_name = "ciHarvest"
  connects_to database: { reading: :wn }
end

当我添加代码时

<% harvest_item = CiHarvestRecord.first
harvest_item 

   %>

并打开相应的页面,我收到错误消息 connects_to can only be called on ActiveRecord::Base or abstract classes`.

我该如何解决,我。 e.告诉 Rails CiHarvestRecord 位于不同的 (wn) 数据库?

我在 MacOS Big Sur 上使用 Ruby 2.6.3 和 Rails 6.1.3。

更新 1: 如果我添加文件 app/models/wn.rb 内容为

class Wn < ActiveRecord::Base
  self.abstract_class = true
  connects_to database: { reading: :wn }
end

然后将 CiHarvestItem.rb 重命名为 ci_harvest_item.rb,现在它包含以下内容:

class CiHarvestRecord < Wn
  self.table_name = "ciHarvest"
end

现在我收到错误 No connection pool for 'Wn' found.

更新二:

我运行

cd db
ln -s ~/dev/wn/wn.db wn.db

然后将 database.yaml 更改为

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

wn:
  <<: *default
  database: db/wn.db

但我仍然遇到与更新 1 中相同的错误。

models/wn.rb 中创建摘要 class ...

class Wn < ActiveRecord::Base
  self.abstract_class = true
  connects_to database: { reading: :wn }
end

然后在 models/ci_harves_record.rb

class CiHarvestRecord < Wn
  self.table_name = "ciHarvest"
end

你应该使用connects_to database: { writing: :wn }

当您仅指定 reading: 关键字时,您将收到此错误 No connection pool for 'Wn' found。当您有只读副本时,您只能将 reading:writing: 一起使用。

查看文档了解更多信息https://edgeguides.rubyonrails.org/active_record_multiple_databases.html#horizontal-sharding