DataMapper:在更新记录之前仅提取已更改的属性

时间:2013-10-13 00:32:03

标签: ruby database datamapper ruby-datamapper

希望有人能指出我正确的方向。

我想知道在调用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)再次访问数据库,是否有更好或更有效的方法来执行此操作?

2 个答案:

答案 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