Rails, использующие несколько баз данных - без явного преобразования nil в String - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь установить соединение с другой БД

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
* 1006Есть идеи почему?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Стоит упомянуть, почему я не использовал код должным образом.Мы также используем Octopus Gem (Gem для запуска нескольких баз данных).Родной метод establish_connection, похоже, не работает, когда Octopus включен: (.

Для всех вас - используйте octopus_establish_connection, но будьте осторожны: https://github.com/thiagopradi/octopus/issues/101

0 голосов
/ 22 февраля 2019

Ваша проблема в том, что Something является абстрактным классом:

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

Абстрактные классы не предназначены для непосредственного создания экземпляров, вы должны создавать их подклассы и создавать экземпляры подклассов.Свойство abstract_class в большей или меньшей степени является способом подкласса моделей без вызова STI (Single Table Inheritance).

Либо используйте 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.
...