【问题标题】:Rails: inject JSON data into tableless PORO modelRails:将 JSON 数据注入到无表 PORO 模型中
【发布时间】:2019-02-16 08:18:58
【问题描述】:

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

有没有办法让我获取填充初始化程序的JSONDatastore 实例并在我的控制器中访问它?我尝试让我的模型成为单例,并且可以通过JSONDatastore.instance 获取实例,但@records 又是nil

【问题讨论】:

  • new 应该在类实例上定义。你的是永远不会被调用的实例方法。
  • 对不起@AlekseiMatiushkin,它应该是initialize,而不是new - 我只是打错了。你能再看看吗?
  • 有两个不同的@recordsinitialize 中赋值的一个是实例变量,你从中读取的一个是类实例变量 i>.
  • 感谢@AlekseiMatiushkin,删除了类 ivar 定义。仍然为零。

标签: ruby-on-rails json ruby


【解决方案1】:

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

【讨论】:

  • 谢谢,它可以工作 :) 首先我试图用 new 设置一个实例变量,但后来无法在控制器中获取该实例,因为我没有任何指向该原始实例的句柄。那没有用。感谢您编辑显示带有类实例变量的初始化程序。我使用了您的第一个建议,但有趣的是看看后者如何工作。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多