Где изменить форматирование представления YAML Active Model? - PullRequest
0 голосов
/ 30 января 2019

Я использую YAML::dump, чтобы иметь (более или менее) простой способ отслеживания изменений в базе данных в репозитории git.Фактически это означает, что я «сбрасываю» части баз данных в набор YAML-файлов, фиксирую их и затем могу довольно легко отслеживать их.В целом, это работает нормально, и я доволен всем процессом.

Единственная проблема - это встроенные JSON документы.Они хранят аспекты данных, которые просто плохо работают в реляционной модели и иногда довольно сложны.YAML::dump сериализует их как однострочную строку (которая кажется оптимальной с точки зрения хранения), но ужасна для различий.В следующем примере показан вывод, который у меня в данный момент есть:

--- !ruby/object:Grammar
concise_attributes:
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: name
  value_before_type_cast: Dynamisches XML
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: slug
  value_before_type_cast: dxml
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: id
  value_before_type_cast: 7e333dff-6d1c-4042-aaa5-0cdf2cfeed7e
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: model
  value_before_type_cast: '{"root": "element", "types": {"if": {"type": "concrete",
    "attributes": [{"name": "condition", "type": "allowed", "nodeTypes": ["expr"]},
    {"name": "body", "type": "allowed", "nodeTypes": [{"occurs": "*", "nodeType":
    "element"}, {"occurs": "*", "nodeType": "text"}, {"occurs": "*", "nodeType": "interpolate"},
    {"occurs": "*", "nodeType": "if"}]}]}, "expr": {"type": "oneOf", "oneOf": ["exprVar",
    "exprConst", "exprBinary"]}, "text": {"type": "concrete", "attributes": [{"base":
    "string", "name": "value", "type": "property"}]}, "element": {"type": "concrete",
    "attributes": [{"name": "tag-open-begin", "type": "terminal", "symbol": "<"},
    {"base": "string", "name": "name", "type": "property"}, {"name": "attributes",
    "type": "allowed", "nodeTypes": [{"occurs": "*", "nodeType": "attribute"}]}, {"name":
    "tag-open-end", "type": "terminal", "symbol": ">"}, {"name": "elements", "type":
    "allowed", "nodeTypes": [{"occurs": "*", "nodeType": "element"}, {"occurs": "*",
    "nodeType": "text"}, {"occurs": "*", "nodeType": "interpolate"}, {"occurs": "*",
    "nodeType": "if"}]}, {"name": "tag-close", "type": "terminal", "symbol": "<ende/>"}]},
    "exprVar": {"type": "concrete", "attributes": [{"base": "string", "name": "name",
    "type": "property"}]}, "attribute": {"type": "concrete", "attributes": [{"base":
    "string", "name": "name", "type": "property"}, {"name": "equals", "type": "terminal",
    "symbol": "="}, {"name": "quot-begin", "type": "terminal", "symbol": "\""}, {"name":
    "value", "type": "allowed", "nodeTypes": [{"occurs": "*", "nodeType": "text"},
    {"occurs": "*", "nodeType": "interpolate"}]}, {"name": "quot-end", "type": "terminal",
    "symbol": "\""}]}, "exprConst": {"type": "concrete", "attributes": [{"base": "string",
    "name": "name", "type": "property"}]}, "exprBinary": {"type": "concrete", "attributes":
    [{"name": "lhs", "type": "allowed", "nodeTypes": ["expr"]}, {"name": "operator",
    "type": "allowed", "nodeTypes": ["binaryOperator"]}, {"name": "rhs", "type": "allowed",
    "nodeTypes": ["expr"]}]}, "interpolate": {"type": "concrete", "attributes": [{"name":
    "expr", "type": "allowed", "nodeTypes": ["expr"]}]}, "binaryOperator": {"type":
    "concrete", "attributes": [{"base": "string", "name": "operator", "type": "property"}]}}}'
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: created_at
  value_before_type_cast: '2018-05-15 18:48:12.004676'
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: updated_at
  value_before_type_cast: '2018-12-20 15:39:19.237639'
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: programming_language_id
  value_before_type_cast: dxml-eruby
- !ruby/object:ActiveModel::Attribute::FromDatabase
  name: technical_name
  value_before_type_cast: dxml
new_record: false
active_record_yaml_version: 2

«Типичный» дифференциал (хотя были только незначительные изменения), затем выглядит примерно так:

Unreadable Diff

Поэтому я бы предпочел вместо этого хранить красиво отформатированное строковое представление model -атрибута.

Я подозреваю, что происходит некоторое "волшебство Rails"где-то за кадром.И я надеюсь, что есть API, чтобы влиять на форматирование.Но следующие вещи не сработали для меня до сих пор:

  • Определите соответствующий метод *_before_type_cast в моем классе моделей.Этот метод не вызывается YAML::dump.
  • Определить to_yaml в моем классе моделей.Этот метод также не вызывается.
  • Я узнал о ActiveModel::AttributeSet::YAMLEncoder, но не мог понять, как / где это следует использовать.Или в этом отношении: как YAML::dump заканчивает тем, что использовал это так или иначе.Кажется, он отвечает за общий формат, который я вижу.
...