Rails使用他的getter覆盖属性

时间:2012-10-26 14:06:51

标签: ruby-on-rails ruby model attributes getter-setter

我的模型中有price属性。

我可以使用attribute-getter,它的名称与属性

类似
def price
   ... logic logic ..
   return something
end

为了覆盖属性本身?

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

能否以无痛的方式完成,还是应该进行before_save回调?

3 个答案:

答案 0 :(得分:7)

如果在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

答案 1 :(得分:3)

由于您似乎希望存储在数据库中的“真实”值,您可能想要做的是修改setter。这样就可以存储实际值,price getter可以不加修改地返回它。

您可以通过较低级write_attribute方法执行此操作。类似的东西:

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

答案 2 :(得分:1)

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