2

priceモデルに属性があります。

属性と同じように名前が付けられた属性ゲッターを使用できますか

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

属性自体をオーバーライドするには?

現在、動作しません。私が呼び出すmodel.priceと動作しますが、 を介してオブジェクトを保存しようとするとmodel.save、デフォルト値が保存されます。

痛みのない方法で行うことはできますか、それともbefore_saveコールバックを行う必要がありますか?

4

3 に答える 3

7

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
于 2012-10-26T14:10:15.037 に答える
3

データベースに「実際の」値を保存したいように見えるので、おそらくやりたいことはセッターを変更することです。このようにして実際の値が保存され、priceゲッターはそれを変更せずに返すことができます。

write_attributeこれは、下位レベルの方法で行うことができます。何かのようなもの:

def price=(value)
  # logic logic
  self.write_attribute(:price, value)
end
于 2012-10-26T14:16:48.297 に答える
1

アトリビュートの値を保存する直前に操作したい場合は、コールバックが目的であるため、コールバックを使用する方が適切です。

于 2012-10-26T14:13:04.947 に答える