【问题标题】:Tracking object changes rails (Active Model Dirty)跟踪对象更改轨道(Active Model Dirty)
【发布时间】:2014-05-27 09:15:17
【问题描述】:

我正在尝试跟踪方法的更改,就像我们使用 Active Model Dirty 跟踪记录属性的更改一样。

目前我正在使用这种方法来检查一组属性的更改。

def check_updated_attributes
    watch_attrs = ["brand_id", "name", "price", "default_price_tag_id", "terminal_usp", "primary_offer_id", "secondary_offer_id"]
    if (self.changed & watch_attrs).any?
      self.tag_updated_at = Time.now
    end
end

但是属性 price 并不是一个普通的带有列的属性,而是模型中定义的一个方法,它结合了两个不同的属性。

这是方法:

    def price
        if manual_price 
            price = manual_price
        else
            price = round_99(base_price)
        end
        price.to_f
    end

有没有办法跟踪这种价格方法的变化?还是这只适用于普通属性?

编辑:基准价格法:

def base_price(rate = Setting.base_margin, mva = Setting.mva)
    (cost_price_map / (1 - rate.to_f)) * ( 1 + mva.to_f)
end

cost_price 和 manual_price 是带有终端表列的属性。

【问题讨论】:

  • 你不能只看属性manual_pricebase_price 而不是price
  • 不,因为 base_price 也是一种方法,只有当 cost_price 属性变化到足以向上或向下舍入 100 时才会发生变化。这意味着,并非 cost_price 的所有变化都会导致价格变化。
  • 因为price 只是一个没有setter 的getter 方法,所以你不能眼睁睁地看着它变脏。观察cost_price,将旧值与新值进行比较,判断其是否变化到足以触发tag_updated_at的变化。
  • @zwippie 你能给我一个例子作为答案吗?我认为它会起作用,只是不知道我如何获取属性的旧值并将其与新值进行比较。

标签: ruby-on-rails activerecord


【解决方案1】:

好的,解决了。

我必须创建一个名为 price_changed 的​​自定义方法?检查价格是否发生了变化。

def price_changed?
    if manual_price 
        manual_price_changed?
    elsif cost_price_map_changed?
        round_99(base_price) != round_99(base_price(cost_price = read_attribute(:cost_price_map)))
    else
        false
    end
end

这解决了问题,但如果您有许多自定义属性,这不是一个很好的解决方案。

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多