Обратный вызов для измененных атрибутов ActiveRecord?

Наличие некоторой системы управления версиями помогает в любом, многих случаях:

Единственный разработчик, единственное ответвление

  • самая основная задача, которую каждая система управления версиями должна выполнить отлично, если это хочет назвать себя, управление версиями должно смочь к [1 139], возвращаются к указанной версии проекта. При создании путаницы вещей Вы можете, добрался до предыдущей версии. Можно исследовать некоторую предыдущую версию, чтобы проверить, как она была сделана затем (например, как она прежде осуществляла рефакторинг, или прежде, чем удалить некоторый код/файл).

    Системы управления версиями берут намного меньше дискового пространства по сравнению с простым сохранением резервных копий с указанной датой, потому что они используют deltaification (хранящий только различия от предыдущей версии) и сжатие. Обычно системы резервного копирования являются средствами сохранить последние версии N проекта, иногда с N=1 (только предыдущая версия), в то время как системы управления версиями (VCS) хранят всю историю проекта. При знании Murphy некоторое время после удаления Энной последней версии, которую Вы осознали бы, это было версией, которую Вы хотите исследовать.

    Дополнительно возвращение к некоторой последней версии легко и автоматизировано. Можно также исследовать, как единственный файл был похож в некоторой прошлой версии, и можно получить различия (в различном формате) между текущим состоянием и некоторой прошлой версией. Вы можете также тег (или 'маркировка') версии, таким образом, можно обратиться к прошлой версии не только по дате, или будучи версия n th от текущей, но также и символьным именем, например v1.2 или v1.2-rc0.

  • С системой управления версиями Вы можете исследовать историю для напоминания Вам, почему (и как) некоторая часть кода (некоторая часть данного файла) прибыла в текущее состояние. Большая часть VCS позволяет исследовать мудрую строкой историю файла, т.е. аннотирующий каждую строку файла, когда это было изменено, в том, какая фиксация, и кого (команду называют annotate, blame или praise в зависимости от VCS). В некотором VCS можно искать историю версию (пересмотр), который представил данный фрагмент кода (например, назвал 'поиск кирки' в Мерзавце, одном из VCS).

    , Чтобы эта функция была действительно полезна, необходимо поддержать некоторую дисциплину: Вы должны описывать каждая новая версия (каждый новый пересмотр / каждая новая фиксация) запись, почему изменение было внесено. Такое описание (сообщение о фиксации) очень полезно, но оно не имеет естественного места в системе резервного копирования.

    Эта функция, конечно, еще более полезна, если Вы не единственный разработчик...

  • Используя систему управления версиями допускает альтернативный способ найти ошибки в коде, а именно, путем поиска истории для нахождения версии, которая представила ошибку: bisectiong история . При нахождении пересмотра, который представил ошибку, Вы ограничите (в лучшем случае: очень ограниченный) область для поиска ошибки, потому что ошибка должна быть в различии между последней рабочей версией и первой версией с ошибкой. Также у Вас было бы описание изменения (сообщение о фиксации) для напоминания Вам, что Вы хотели сделать. Эту функцию также иногда называют разность, отлаживающая . Современные системы управления версиями (VCS) имеют поддержку , автоматизировал (или полуавтоматический) поиск истории путем деления пополам его (разделение пополам истории, находя, какая часть содержит ошибку, повторитесь, пока единственная ответственная версия не найдена), в форме bisect (или подобный) команда.

    , Чтобы эта функция была действительно полезна, необходимо поддержать некоторую дисциплину: необходимо фиксировать (сохраните изменения / помещает данное состояние в систему управления версиями для запоминания), единственное изменение, имея дело только с одной функцией, только с небольшой разницей от предыдущей версии; т.е. фиксация часто.

  • Большинство систем управления версиями предлагает различный рычаги , которые позволяют, например, для автоматизированного тестирования, или автоматизированного здания продукта... или просто напоминания Вам, что Вы не следуете стандарту кодирования (кодирование инструкций).

Единственный разработчик, несколько ответвлений

  • Системы управления версиями позволяют создавать несколько альтернативных параллельных строк разработки, названной ответвлениями (или потоки или представления). Общий падеж имеет ответвления разработки , т.е. имеет отдельное ответвление для нестабильной разработки (для тестирования новых возможностей), отдельное ответвление для стабильного (основной, соединительная линия) версия, которая является (или должен быть), текущая рабочая версия, и один на более отдельном обслуживании (fixup) ответвления.

    ответвления обслуживания Наличия позволяют Вам делать bugfixes и генерировать пакеты обновления / вспомогательная версия с исправлениями к некоторой выпущенной версии без потребности волноваться об интерференции от новой разработки. Позже можно объединить ответвление maintenace в стабильный, или выбрать bigfix от ответвления обслуживания в стабильный и ответвлений разработки (если дальнейшая/другая разработка не исправляла ошибку независимо).

  • современный VCS (здесь современный означает, что и ветвление и слияние ответвлений легки) позволяют идти немного далее, т.е. генерировать отдельное ответвление для работы над отдельной функцией (так называемый ответвления темы ). Это позволяет Вам переключаться между работой одной одной функции к работе над другой функцией (и не только переключаться от eveloping новой возможности до того, чтобы продолжать работать срочного, запросил bugfix).

  • при разработке продукта на основе источника некоторого другого (обычно третье лицо) продукт действительно необходимо использовать , ответвления поставщика для сможения к легкому интегрируют новую версию продукта от поставщика с изменениями, которые Вы внесли. По общему признанию это больше не просто "единственный разработчик" случай.

Несколько разработчиков

  • Используя системы управления версиями приносят еще больше преимущества, если существует больше чем один разработчик, работающий над тем же проектом. VCS допускает параллельная (параллельная) разработка , не волнуясь, что кто-то перезаписал бы Ваши изменения или не принимает Ваши изменения во внимание. Конечно, использование системы управления версиями не является никакой заменой для коммуникации.

  • Все вышеупомянутые функции еще более важны в случае нескольких-разработчиков: исследование, кто генерировал данное изменение, кто продержался, изменило код (иначе. кто повредил сборку), находя ошибку в коде не записанной только Вами.

17
задан Mario 3 October 2009 в 15:08
поделиться

3 ответа

Ответ cwninja должен помочь, но есть кое-что еще.

Прежде всего, обработка базовых атрибутов выполняется с помощью метода write_attribute, поэтому вам следует подключиться к это.

Rails также имеет встроенную структуру обратного вызова, которую было бы неплохо использовать, хотя она не позволяет передавать аргументы, что немного раздражает.

Используя пользовательские обратные вызовы, вы можете сделать это следующим образом :

class Person < ActiveRecord::Base

  def write_attribute(attr_name, value)
    attribute_changed(attr_name, read_attribute(attr_name), value)
    super
  end

  private

    def attribute_changed(attr, old_val, new_val)
      logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
    end

 end

Если вы хотите попробовать использовать обратные вызовы Rails (особенно полезно, если у вас может быть несколько обратных вызовов и / или создание подклассов), вы можете сделать что-то вроде этого:

class Person < ActiveRecord::Base
  define_callbacks :attribute_changed

  attribute_changed :notify_of_attribute_change

  def write_attribute(attr_name, value)
    returning(super) do
      @last_changed_attr = attr_name
      run_callbacks(:attribute_changed)
    end
  end

  private

    def notify_of_attribute_change
      attr = @last_changed_attr
      old_val, new_val = send("#{attr}_change")
      logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
    end

end
18
ответ дан 30 November 2019 в 10:43
поделиться

попробуйте:

def attribute_changed(attribute_name, old_value, new_value)
end

def attribute=(attribute_name, value)
  returning(super) do
    attribute_changed(attribute_name, attribute_was(attribute_name), attribute(attribute_name))
  end
end

Только что придумал это сейчас, но оно должно работать.

5
ответ дан 30 November 2019 в 10:43
поделиться

Вы всегда можете получить доступ к частному метод changed_attributes и проверьте ключи там с помощью before_save и делайте с ним, что хотите.

3
ответ дан 30 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: