0

我正在尝试设置与另一个数据库的连接

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

知道为什么吗?

4

2 回答 2

1

您的问题是这Something是一个抽象类:

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

抽象类并不意味着直接实例化,您应该对它们进行子类化并实例化子类。该abstract_class属性或多或少是一种在不调用 STI(单表继承)的情况下对模型进行子类化的方法。

要么Something用作第二个数据库中模型的基类,要么删除它self.abstract_class = true以使其成为“真正的”模型类。


至于您的no implicit conversion of nil into String错误来自哪里,请记住,抽象模型类没有表名并且无法实例化,来自文档

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.
于 2019-02-21T21:16:31.837 回答
1

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

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

于 2019-02-22T09:57:51.727 回答