我的模型中有一个price
属性。
我可以使用attribute-getter吗,它的命名就像属性一样
def price
... logic logic ..
return something
end
为了覆盖属性本身?
目前它不起作用。如果我称它为model.price
有效,但是当它通过 保存对象时model.save
,它会存储默认值。
它可以以无痛的方式完成,还是我应该进行before_save
回调?
我的模型中有一个price
属性。
我可以使用attribute-getter吗,它的命名就像属性一样
def price
... logic logic ..
return something
end
为了覆盖属性本身?
目前它不起作用。如果我称它为model.price
有效,但是当它通过 保存对象时model.save
,它会存储默认值。
它可以以无痛的方式完成,还是我应该进行before_save
回调?
如果你在 Ruby 中设置一个值,你就可以访问 setter 方法。如果要覆盖设置器,则必须执行以下操作:
def price=(_price)
# do some logic
write_attribute(:price, _price)
end
这当然是一个讨论点。有时您可以更好地使用回调。像这样的东西:
before_save :format_price
private
def format_price
# Do some logic, for example make it cents.
self.price = price * 100
end
由于您似乎希望将“真实”值存储在数据库中,因此您可能想要做的是修改设置器。这样实际值就被存储了,price
getter 可以不加修改地返回它。
您可以通过较低级别的write_attribute
方法执行此操作。就像是:
def price=(value)
# logic logic
self.write_attribute(:price, value)
end
如果您想在保存属性值之前对其进行操作,那么使用回调将是更好的方法,因为这就是回调的用途。