Rails: внедрить данные JSON в модель PORO без таблиц - PullRequest
0 голосов
/ 16 февраля 2019

Через инициализатор Rails 5.2.1 я импортирую customers.json в модель без таблиц без использования функций БД.Эти данные JSON должны быть загружены в память один раз при запуске Rails, а затем доступны по мере необходимости во всем приложении.При перезапуске приложения оно перезагружается снова.

Что я сделал до сих пор:

initializers/json_loader.rb

data = JSON.parse(File.read('tmp/customers.json'), symbolize_names: true)
JSONDatastore.new(data) # load into model

app/models/json_datastore.rb

class JSONDatastore

  def initialize(records)
    @records = records
  end

  def self.records
    return @records
  end
end

Проблема: когда я делаю это таким образом, в контроллерах я не могу получить заполненный экземпляр JSONDatastore, который был установлен в инициализаторе.Он заполнен данными JSON в инициализаторе, но когда я пытаюсь получить к нему доступ в другом контроллере, вызывая JSONDatastore.records, я получаю nil, даже если я установил config.cache_classes = true

Есть ли способ для меняполучить этот экземпляр JSONDatastore заполненный инициализатор и получить к нему доступ в моих контроллерах?Я попытался сделать мою модель одиночной и мог получить экземпляр через JSONDatastore.instance, но @records снова был nil.

1 Ответ

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

Вы должны четко понимать разницу между областью видимости класса и областью действия экземпляра.Ваш records является методом класса, возвращающим переменную экземпляра класса initialize вы устанавливаете переменную экземпляра .Они имеют одно и то же имя, но не имеют ничего общего.

Установите вместо этого переменную экземпляра класса .

class JSONDatastore
  def self.assign(records)
    @records = records
  end

  def self.records
    @records
  end
end

И вызовите JSONDatastore.assign вместо new.


Если вы все еще после злоупотребления инициализатором для установки переменной экземпляра класса, это будет делать:

def initialize(records)
  self.class.instance_variable_set(:@records, records)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...