Ruby on rails 我可以在RubyonRails模型中使用JSON文件作为数据源吗

Ruby on rails 我可以在RubyonRails模型中使用JSON文件作为数据源吗,ruby-on-rails,json,ruby,activemodel,Ruby On Rails,Json,Ruby,Activemodel,我有一个包含一些数据的JSON文件,我喜欢创建一个模型,像ActiveRecord类一样表示JSON文件中的数据 我的JSON看起来像是福林而不是真实的数据只是一个例子: [ { "name": "Test", "model": "L33D", "value": 69 }, { "name": "Test2", "model": "Chill", "value": 420 }, { "name": "Test3", "model": "Banana",

我有一个包含一些数据的JSON文件,我喜欢创建一个模型,像ActiveRecord类一样表示JSON文件中的数据

我的JSON看起来像是福林而不是真实的数据只是一个例子:

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

]

因此,如果有一个可以编写MyModel.find by:name test3之类的东西的模型就好了


如何为与数据库无关的数据编写模型?还是我只编写普通的旧ruby并编写一个普通类?

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


如果您是从输出JSON的RESTful API读取数据,您可以使用ActiveResource,但如果您只是从磁盘加载一个文件,这并没有真正的帮助。

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

如果您是从输出JSON的RESTful API读取数据,您可以使用ActiveResource,但如果您只是从磁盘加载一个文件,这并没有多大帮助。

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

从Rails 5开始,您还拥有ActiveModel::Attributes,它为以前是内部特性的特性提供了公共api。它提供类型转换和定义默认值的好方法

class MyModel
  include ActiveModel::Model
  include ActiveModel::Attributes # not included in the above
  attribute :awesomeness, :integer, default: 0
  # ...
end
但是如何将它与JSON文件一起使用呢? 您可以创建一个类方法或一个单独的类,用于加载和解析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
这是个好主意吗? 除非您的用例非常简单,否则不会。要查找单个条目,必须解析整个文件并将其加载到内存中。然后必须使用enumerable中的基本数组操作。任何类型的数据库系统都经过优化,可以更有效地实现这一点

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

如果您是通过git部署的,这也意味着您必须将数据检查到代码库中。这很少是一个好主意,因为它会极大地增加搅动和噪声量,您必须通过筛选才能找到代码库中的实际变化

任何nosql或sql数据库都可以做得更好。

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

从Rails 5开始,您还拥有ActiveModel::Attributes,它为以前是内部特性的特性提供了公共api。它提供类型转换和定义默认值的好方法

class MyModel
  include ActiveModel::Model
  include ActiveModel::Attributes # not included in the above
  attribute :awesomeness, :integer, default: 0
  # ...
end
但是如何将它与JSON文件一起使用呢? 您可以创建一个类方法或一个单独的类,用于加载和解析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
这是个好主意吗? 除非您的用例非常简单,否则不会。要查找单个条目,必须解析整个文件并将其加载到内存中。然后必须使用enumerable中的基本数组操作。任何类型的数据库系统都经过优化,可以更有效地实现这一点

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

如果您是通过git部署的,这也意味着您必须将数据检查到代码库中。这很少是一个好主意,因为它会极大地增加搅动和噪声量,您必须通过筛选才能找到代码库中的实际变化


任何nosql或sql数据库都可以做得更好。

为什么不将其导入Mongodb这样的数据库?特别是如果它是一个大文件。它不是大的,它只是定义了我拥有的一些设备。但是将它们导入到一个iziliser中可能是一个选项,但感觉很不舒服为什么不只是将其导入Mongodb这样的数据库?特别是如果它是一个大文件。它不是大的,它只是定义了我拥有的一些设备。但是,将它们导入到iziliser中是一种选择,但感觉hackyit只是磁盘上的一个文件。但是,如果我能用它制作一个模型,那么我的GraphQL就可以处理这个问题了box@ZeroSoulEater您可以包括ActiveModel::Model之类的模块来提供一些基本行为。它包括模型名内省、转换、翻译和验证。除此之外,它还允许您使用属性散列来初始化对象,就像活动记录一样。-@3limin4t0r很酷,看起来它可以工作!谢谢,我会尽力的
t、 它只是磁盘上的一个文件。但是如果我能用它来制作一个模型,那就太酷了,这样我的GraphQL就可以用磁盘来处理这个问题了box@ZeroSoulEater您可以包括ActiveModel::Model之类的模块来提供一些基本行为。它包括模型名内省、转换、翻译和验证。除此之外,它还允许您使用属性散列来初始化对象,就像活动记录一样。-@3limin4t0r很酷,看起来它可以工作!谢谢,我会试试的。回答真的很酷!非常感谢。我知道我的案例非常具体,我现在还没有一个大文件,目标是在其他项目中重用这个文件,并开发这个快速:真正酷的答案!非常感谢。我知道我的案例非常具体,我现在没有一个大文件,目标是在其他项目中重用此文件并快速开发: