Rails使用他的getter覆盖属性



我的模型中有一个price属性。

我可以使用属性getter吗,它的名称与属性一样

def price
... logic logic ..
return something
end

以便覆盖属性本身?

目前它不起作用。如果我调用model.price,它可以工作,但当它设法通过model.save保存对象时,它会存储默认值。

可以以无痛的方式完成吗?还是应该进行before_save回调?

如果在Ruby中设置值,则访问setter方法。如果你想覆盖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

由于您似乎希望将"真实"值存储在数据库中,因此您可能想要做的是修改setter。通过这种方式存储实际值,pricegetter可以不加修改地返回它。

您可以通过较低级别的write_attribute方法来完成此操作。类似于:

def price=(value)
# logic logic
self.write_attribute(:price, value)
end

如果您想在保存属性之前操作属性的值,那么使用回调将是一种更好的方法,因为这就是回调的作用。

最新更新