2013-10-13 5 views
0

Надеясь, что кто-то может указать мне в правильном направлении.DataMapper: извлечение только измененных свойств перед обновлением записи

Я хочу знать, есть ли способ для просмотра/извлечения значений новых и старых свойств с помощью DataMapper до вызова метода update и сравнения значений.

Сценарий выглядит следующим образом: У меня есть билетный ресурс, и мне нужно уведомить различные заинтересованные стороны об изменениях, внесенных в билет. Уведомление по электронной почте об изменениях состояния оплаты, уведомление SMS, когда прибудет билет назначен вспомогательным персонал и т.д.

В настоящее время в моем классе по продаже билетов, я настроил обратный вызов/фильтр так:

before :update, :notify_changes 

def notify_changes 
    ticket = Ticket.get(self.id) # Get the original 
    if ticket.status != self.status 
     # Send out the email notification 
    end 
    if ticket.assigned_support != self.assigned_support 
     # Send out the SMS notification 
    end 
    # ... etc 
end 

Есть ли лучший или более эффективный способ сделать это, не удаляя базу данных снова на ticket = Ticket.get(self.id)?

+0

ли вам не нравится, прежде чем обновление обратного вызова? Или 'if ticket.status! = Self.status'? – AdamT

+0

Я надеялся найти способ сделать это, не ударяя базу данных снова в 'ticket = Ticket.get (self.id)'. Если объект знает, что он был изменен, то, надеюсь, он будет знать, что изменилось, не так ли? @AdamT – SeanNieuwoudt

ответ

1

Хорошо, я понял это сам. Здесь для справки, если кто-то находит себе задают тот же вопрос:

before :update, :notify_changes 

def notify_changes 
    # The status property has been changed 
    if !dirty_attributes[Ticket.properties[:status]].nil? 
     # old status: original_attributes[Ticket.properties[:status]] 
    end   

    # The assigned_support property has been changed 
    if !dirty_attributes[Ticket.properties[:assigned_support]].nil? 
     # old status: original_attributes[Ticket.properties[:assigned_support]] 
    end   
end 

Вдохновение Ссылка: This thread

1

Да, я имел в виду загрязнен, когда я спросил, что. Просто чтобы добавить немного больше, кто-то другой сталкивается с этим вопросом.

Существует несколько методов, которые можно вызвать для проверки статуса атрибута или объекта модели.

- (Boolean) attribute_dirty?(name) 
- (Boolean) clean? 
- (Boolean) dirty? 
- (Hash) dirty_attributes # your choice 
- (Hash) original_attributes 

Они являются частью DataMapper::Resource и могут быть найдены здесь: http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Resource