希望有人能指出我正确的方向。
我想知道在调用update
方法之前是否有办法使用DataMapper查看/获取新旧属性值并比较这些值。
方案如下: 我有一个票务资源,我需要通知各利益相关方对票证所做的更改。付款状态更改时的电子邮件通知,将票证分配给支持人员时的短信通知等。
目前,在我的Ticket类中,我已经设置了一个像这样的回调/过滤器:
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 :(得分: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 :(得分: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