ActiveRecord 属性メソッドをオーバーライドする 質問する

ActiveRecord 属性メソッドをオーバーライドする 質問する

私が話していることの例:

class Person < ActiveRecord::Base
  def name=(name)
    super(name.capitalize)
  end
  def name
    super().downcase  # not sure why you'd do this; this is just an example
  end
end

これはうまくいくようですが、私はちょうど属性メソッドのオーバーライドに関するセクションを読んだばかりですActiveRecord::Base ドキュメントread_attribute、およびメソッドの使用を提案していますwrite_attribute。上記の例で私が行っていることは何か間違っているに違いないと思いました。そうでなければ、なぜこれらのメソッドが属性メソッドをオーバーライドする「正しい方法」として認められるのでしょうか? また、はるかに醜い慣用句を強制しているので、正当な理由があるに違いありません...

私の本当の質問は、この例に何か問題があるのか​​ということです。

ベストアンサー1

Gareth のコメントに同意します... コードは記述どおりには動作しません。次のように書き直す必要があります。

def name=(name)
  write_attribute(:name, name.capitalize)
end

def name
  read_attribute(:name).downcase  # No test for nil?
end

おすすめ記事