Rails 使用多个数据库 - 没有将 nil 隐式转换为 String

Rails using multiple databases - no implicit conversion of nil into String

我正在尝试建立与另一个数据库的连接

class Something < ApplicationRecord
  self.abstract_class = true
  establish_connection {adapter:"postgresql",host:"localhost",port:5432,database:"dev_x",user:"user",password:"1234"}
end

但每当我尝试 运行 一个方法(例如:Something.all)时,我都会收到错误消息:

no implicit conversion of nil into String

知道为什么吗?

你的问题是 Something 是一个抽象 class:

class Something < ApplicationRecord
  self.abstract_class = true # <-------------------------

Abstract classes 并不意味着直接实例化,你应该对它们进行 subclass 并实例化 subclasses。 abstract_class 属性 或多或少是一种无需调用 STI(单一 Table 继承)即可子class 模型的方法。

要么使用 Something 作为第二个数据库中模型的基础 class,要么删除 self.abstract_class = true 使其成为 "real" 模型 class。


至于你的 no implicit conversion of nil into String 错误来自哪里,请记住抽象模型 classes 没有 table 名称并且无法实例化,来自 the documentation:

class Shape < ActiveRecord::Base
  self.abstract_class = true
end
Polygon = Class.new(Shape)
Square = Class.new(Polygon)

Shape.table_name   # => nil
Polygon.table_name # => "polygons"
Square.table_name  # => "polygons"
Shape.create!      # => NotImplementedError: Shape is an abstract class and cannot be instantiated.

值得一提的是为什么我没有正确使用代码。我们还使用 Octopus gem(gem for 运行 多数据库)。当八达通打开时,本机 establish_connection 方法似乎不起作用:(.

对于你们所有人 - 使用 octopus_establish_connection 但要注意:https://github.com/thiagopradi/octopus/issues/101