Rails:将JSON数据注入到无表PORO模型中

时间:2019-02-16 08:18:58

标签: ruby-on-rails json ruby

通过Rails 5.2.1初始化程序,我将customers.json导入到无表模型中,而没有使用任何DB功能。此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 :(得分:1)

您应该清楚地了解类范围和实例范围之间的区别。您的records是一个返回 class实例变量的类方法。您在initialize中设置的是 instance变量。它们具有相同的名称,但没有共同点。

改为设置您的类实例变量

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