繁体   English   中英

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

[英]Rails: inject JSON data into tableless PORO model

通过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在其他控制器中的某个位置访问它时,即使设置了config.cache_classes = true ,我也不会得到nil

我有什么方法可以获取填充在初始值设定项中的JSONDatastore实例,并在我的控制器中对其进行访问? 我尝试使模型成为单例,并且可以通过JSONDatastore.instance获取实例,但是@records再次nil

您应该清楚地了解类范围和实例范围之间的区别。 您的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM