飲んだり寝たり

だいたいメモ

Active Recordで属性にアクセスするメソッドを上書きする

RailsでUserモデルがあってそれがnameという属性を持っているとする. このとき例えば, User#nameの値を条件fooによって変えたいとき,

1
2
3
4
5
class User < ActiveRecord::Base
  def name
    foo ? self[:name] : 'some special value'
  end
end

のようにnameメソッドを上書きしてやればよい.

ちなみにself[:name][]read_attributeのaliasで, 別にwrite_attributeもあるらしい(参考).

上書きというよりは先に定義していると言った方が正確だと思う. というのもaround aliasを使って

1
2
3
4
5
6
class User < ActiveRecord::Base
  alias :org_name :name
  def name
    foo ? org_name : 'some special value'
  end
end

のように定義しようとするとねーむってなぁに?って怒られるからだ. 多分(確認すればいいのだけど), method_missingで処理してるんだと思う.

Comments