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