2015-06-10 5 views
0

Без STI (однократное наследование), есть ли способ проверить, была ли какая-либо модель создана или обновлена, и определить, какая модель и какие атрибуты были изменены/обновлены на модели?ActiveRecord при создании, обновлении любой модели

т. Е. Вывод работы сервера рельсов показывает весь HTTP-трафик и запросы, выполняемые в БД. Для целей недействительности кеша я пытаюсь написать код, который требует от меня знать это.

Я ищу after_create и after_update, но вместо какой-либо одной модели мне нужно иметь универсальное после создания и после обновления и иметь возможность определять, какая модель была создана или обновлена.

Можно ли это сделать в ActiveRecord? Если да, то как?

ответ

2

Если вы не меняете логику всех моделей, это не универсальный крючок, поэтому вы не захотите делать это в ActiveRecord::Base. Дак печатает, как будто это плохо.

Похоже, что у вас есть общее поведение и способ обработки, который будет модулем (или ActiveSupport::Concern).

Пример редактировался here (при условии, что вы работаете в Rails 3+)

module MaintainAnInvariant 
    # common logic goes here 
    extend ActiveSupport::Concern 

    included do 
    after_save :maintain_invariant_i_care_about 
    end 

    def maintain_invariant_i_care_about 
    do_stuff_pending_various_logic 
    end 
end 

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

class OneOfTheModelsWithThisLogic < ActiveRecord::Base 
    include MaintainAnInvariant 
end 

class AnotherModelWithCommonLogic < ActiveRecord::Base 
    include MaintainAnInvariant 
end 

Что касается остаток вашего ответа, как узнать, что изменилось, вы ищете методы ActiveModel::Dirty. Это позволяет проверить, что изменилось в ваших моделях:

person.name = 'Bill' 
person.name_changed? # => false 
person.name_change # => nil 
person.name = 'Bob' 
person.changed # => ["name"] 
person.changes # => {"name" => ["Bill", "Bob"]} 
+0

Как определить, какая модель обновлена? – Noah

+0

Вы включаете код в сами файлы модели, поэтому это будет «эта» модель, где «тот» - это какая-либо модификация модели. Я обновил свой пример, чтобы дать понять, что ваш код 'include' включен в модель ActiveRecord – ABMagil

+0

Как узнать модель в методе' maintain_invariant_i_care_about'? – Noah

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