我可以在 Rails 模型的 Ruby 中使用 JSON-File 作为数据源吗

Can I use a JSON-File as datasource in a Ruby on Rails model

我有一个包含一些数据的 JSON 文件,我想创建一个模型来表示来自 JSON 文件的数据,例如 ActiveRecord class。

我的 JSON 看起来像下面的(不是真实数据只是一个例子):

[
 {
  "name": "Test",
  "model": "L33D",
  "value": 69
 },
{
  "name": "Test2",
  "model": "Chill",
  "value": 420
 },
 {
  "name": "Test3",
  "model": "Banana",
  "value": 1337
 }

]

所以最好有一个模型,我可以在其中编写 MyModel.find by :name "test3"

如何为 none 数据库相关数据编写模型?或者我只是做普通的旧 ruby 并写一个普通的 Class?

您将编写普通的旧 Ruby 并提供您需要的功能。 ActiveModel 在这里并不是很有用。

如果您正在从输出 JSON 的 RESTful API 读取数据,您可以使用 ActiveReource,但如果您只是加载文件,那将无济于事磁盘.

是否可能 - 是的。

在 Rails 中,您有 ActiveModel::Model 这是一个模块,包括验证、属性分配、表单集成、多态路由等。除了通常由 ActiveRecord 提供的实际持久层之外,几乎所有内容.您还可以通过仅包含子模块来挑选功能。

从 Rails 5 开始,您还有 ActiveModel::Attributes,它为过去内部的功能提供了 public api。它提供类型转换和定义默认值的好方法。

class MyModel
  include ActiveModel::Model
  include ActiveModel::Attributes # not included in the above
  attribute :awesomeness, :integer, default: 0
  # ...
end

但是如何将它用于 JSON 文件?

您可以创建一个 class 方法或单独的呼吸 class 来加载和解析 JSON 文件并创建模型实例:

class MyModel
  include ActiveModel::Model
  include ActiveModel::Attributes # not included in the above
  attribute :awesomeness, :integer, default: 0
  # ...

  def self.all
    data = JSON.parse(File.open('/path/to/file.json'))
    data.map do |hash|
      new(hash)
    end
  end
end

这是个好主意吗?

除非您的用例非常简单,否则不会。要找到单个条目,您必须解析整个文件并将其加载到内存中。然后你必须使用可枚举的基本数组操作。任何类型的数据库系统都经过优化,可以更有效地执行此操作。

如果您要部署到任何类型的临时文件系统(如 Heroku),它与 SQLite 具有相同的缺点。对文件的任何更改将定期完全覆盖。

如果您通过 git 进行部署,这也意味着您必须将数据检入代码库。这很少是一个好主意,因为它会大大增加流失率和您必须筛选才能找到代码库中的实际更改的噪音量。

任何没有sql 或 sql 的数据库都可以做得更好。