2

У меня есть модель Customer с 3 атрибутами: имя, телефон и адрес электронной почты. В начале у меня есть экземпляр клиента с некоторыми значениями: Mark, +54261334455 и [email protected]. Затем я меняю эти значения на: Peter, +54261444444, [email protected], но мне нужно сохранить старые значения. Как я могу это сделать?Персистентные атрибуты модели ActiveRecord

Мои варианты:

  1. создают old_attr столбцы: имя, телефон, адрес электронной почты, предыдущее_имя, old_phone и OLD_EMAIL. Я думаю, что это уродливое решение ...
  2. Использовать serialize для сохранения старых данных с дополнительным полем: имя, телефон, адрес электронной почты и данные. Я думаю, что это не очень хорошая идея, так как вам нужно многократно обрабатывать старые данные.
  3. создать 2 экземпляра клиента. Один со старыми данными другой с новыми данными, добавляющими дополнительное поле к модели клиента для связывания этих объектов. Я думаю, что это лучшее решение, но мне нужно будет добавить много логики из-за разделения «одного клиента» на два

лучшие идеи для этого?

ответ

1

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

Одним из лучших решений я знаю это paper_trail

1

Вариант 4: Создать ClientHistory модель, которая идентична Client с добавлением client_id столбца, который ссылается на соответствующий Client. Затем before_save обратный вызов может сделать что-то вроде этого:

before_save :track_history 

def track_history 
    return if(new_record? || !changed?) 
    old = Hash[attribute_names.map { |name| [name == 'id' ? 'client_id' : name, self.send("#{name}_was")] }] 
    ClientHistory.create!(old) 
end 

new_record? || !changed? может проталкивание к :if опции на before_save вызове конечно. Возможно, вы захотите отфильтровать attribute_names, чтобы оставить больше вещей, и, возможно, вам захочется отслеживать только те изменения, которые были изменены, оба из них довольно тривиальные модификации (но будьте осторожны, как вы отслеживаете до nil и от nil переходов) ,

+0

Эта идея в значительной степени, как мой первый вариант. Я не хочу дублировать атрибуты в одной или двух таблицах. – Leantraxxx

Смежные вопросы