Могу ли я использовать JSON-файл в качестве источника данных в модели Ruby on Rails - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть JSON-файл с некоторыми данными, и мне нравится создавать модель, которая представляет данные из JSON-файла, как класс ActiveRecord.

Мой JSON выглядит как фоллинг (не реальные данные, просто пример):

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

]

Так что было бы неплохо иметь модель, в которой я мог бы писать такие вещи, как MyModel.find by :name "test3"

Как написать модель для данных, не связанных с базами данных? Или я просто делаю обычный старый рубин и пишу нормальный класс?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Возможно ли это - да.

В 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

Это хорошая идея?

Не совсем, если ваш вариант использования очень упрощен. Чтобы найти одну запись, вы должны проанализировать и загрузить весь файл в память. И тогда вам придется использовать базовые манипуляции с массивами из перечисляемых. Любая система баз данных оптимизирована для более эффективной работы.

Если вы развертываете какую-либо эфемерную файловую систему, такую ​​как Heroku, она имеет те же минусы, что и SQLite. Любые изменения в файле будут регулярно перезаписываться.

Если вы развертываете через git, это также означает, что вы должны проверить свои данные в своей базе кода. Это редко хорошая идея, поскольку она значительно увеличивает отток и количество шума, которое вы должны просеять, чтобы найти реальные изменения в кодовой базе.

Любая база данных nosql или sql действительно может сделать это лучше.

0 голосов
/ 07 ноября 2019

Вы бы написали обычный старый Ruby и предоставили бы вам необходимую функциональность. ActiveModel здесь не очень полезен.

Если вы читали из RESTful API, который выводил JSON, вы могли бы использовать ActiveReource, но это не очень поможет, если вы просто загружаете файл с диска.

...