Как сделать снимок связанных данных при создании записи в рельсах?

В моем приложении rails структура БД такова, что есть несколько основных таблиц и некоторые таблицы, данные которых основаны на этих основных таблицах (через ассоциации). Например, рассмотрим три основных элемента таблицы: бренды, единицы измерения (единица измерения). Каждая из этих трех таблиц имеет атрибут под названием "имя" вместе с другими атрибутами. Теперь у нас есть еще одна таблица, которая называется покупками. Для создания покупки мне нужно выбрать один товар, одну марку и одну единицу. Но проблема здесь в том, что если кто-то изменит название предмета или любые другие связанные данные, запись в таблице покупок изменится.

Мой вопрос в том, каковы возможные пути выхода из этой ситуации. Одно из простых решений - предотвратить редактирование основных данных. Но я также хочу знать, можно ли эффективно копировать связанные данные при совершении покупки.

1 ответ

См. Обратные вызовы Rails Active Record. Обратные вызовы позволяют писать методы, которые будут запускаться при указанном действии.

Например, см. Этот образец кода, взятый из документации Rails, где разработчик изменяет данные до и после запуска проверки модели Rails.

class User < ApplicationRecord
  before_validation :normalize_name, on: :create
 
  # :on takes an array as well
  after_validation :set_location, on: [ :create, :update ]
 
  private
    def normalize_name
      self.name = name.downcase.titleize
    end
 
    def set_location
      self.location = LocationService.query(self)
    end
end
Другие вопросы по тегам