`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
在我的 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