[英]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.