Параметры отчёта хо...
 
Уведомления
Очистить всё

Параметры отчёта ходят хэшем через пять классов. Data или Struct?

5 Сообщения
4 Пользователи
1 Реакции
343 Просмотры
pavel_1988
Сообщения: 8
Автор темы
Разобрался с блоками разработчик
Присоединился: 3 года назад
[#109]

Rails 8.1, Ruby 4.0, отчёты из ClickHouse. Параметры ходят хэшем через пять классов:

options = {
  from: params[:from],
  to: params[:to],
  group_by: params[:group_by] || "day",
  currency: "RUB"
}

ReportQuery.new(options).call
ReportExporter.new(options.merge(format: "xlsx")).call

Полдня искал баг, а это была опечатка options[:form] вместо :from, которая молча вернула nil. Хочу объект с явными полями. Struct или Data, и где делать значения по умолчанию?


4 ответа
kirill_spb
Сообщения: 27
Собрал свой gem разработчик инструментов
Присоединился: 4 года назад

Data, раз параметры после создания не меняются. Значения по умолчанию и проверки удобно делать в своём initialize, а super без аргументов передаст дальше все именованные:

ReportParams = Data.define(:from, :to, :group_by, :currency) do
  def initialize(from:, to:, group_by: "day", currency: "RUB")
    unless %w[day week month].include?(group_by)
      raise ArgumentError, "unknown group_by: #{group_by}"
    end

    super
  end
end

report = ReportParams.new(from: Date.new(2026, 1, 1), to: Date.new(2026, 1, 31))
report.group_by              # => "day"
report.with(currency: "USD") # новый объект, старый не меняется
report.form                  # NoMethodError вместо тихого nil

Подробно про Data есть в документации: https://docs.ruby-lang.org


Ответ
kostya.sokurov
Сообщения: 73
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад

Я бы в том же initialize ещё проверял, что from не позже to, это самая частая ошибка в отчётах. А строки из формы в даты пусть приводит контроллер или форм-объект. Data лучше получать уже готовые значения, иначе он начнёт знать про формат параметров.


Ответ
Максим О
Сообщения: 22
Собрал свой gem студент
Присоединился: 2 года назад

а чем Data тогда отличается от Struct, кроме того что поля нельзя менять? когда что брать?


Ответ
1 ответ
kirill_spb
Присоединился: 4 года назад

Собрал свой gem разработчик инструментов
Сообщения: 27

Struct можно создать без части полей, они станут nil, а Data требует все. У Struct есть сеттеры, и он ведёт себя почти как массив: to_a, each, доступ по индексу. Data ничего этого не умеет, и в этом его смысл. Я беру Struct для временных штук внутри одного метода, а Data для всего, что передаётся между классами.


Ответ