Modelクラスのカラムフィールドアクセス

INDEX PAGE


Modelクラスのカラムフィールドアクセス


Railsも使い込んでくると、コントローラー間で共通の処理を
なるべくModelクラスのほうに定義して共通化を図りたくなります。
その時に一箇所落とし穴があるので共有までに。


例えば画面からhogeという入力欄をつくった場合

class Fugas < ActiveRecord::Base

 attr_accessor :hoge

end


とすると、実際にこのFugaテーブルにHogeというカラムが存在しなくても
画面側でうまく処理することができるようになります。


ここで、hogeのカラムが呼ばれた時には
fugaカラムにカッコをつけて返したいという場合

class Fugas < ActiveRecord::Base

 attr_accessor :hoge

 def hoge
  return "(#{fuga})" if fuga
  return nil
 end

end


さらに、hogeの値に「。」を取り付けてfugaカラムに登録したいという場合

class Fugas < ActiveRecord::Base

 attr_accessor :hoge

 def hoge
  return "(#{fuga})" if fuga
  return nil
 end

 def hoge=(val)
  fuga = "#{val}." if val
 end

end


と書くことでうまく行くような気がするのですが
何故かこれがうまく行きません。
色々試した結果

class Fugas < ActiveRecord::Base

 attr_accessor :hoge

 def hoge
  return "(#{fuga})" if fuga
  return nil
 end

 def hoge=(val)
  self.fuga = "#{val}." if val
 end

end


とするとうまく行くことがわかりました。
selfはモデルクラスのメソッドの中で使用すると
他の言語の"this."と同じ役割を果たすようです。


というわけで、最近では気持ち悪いので

class Fugas < ActiveRecord::Base

 attr_accessor :hoge

 def hoge
  return "(#{self.fuga})" if self.fuga
  return nil
 end

 def hoge=(val)
  self.fuga = "#{val}." if val
 end

end


と、本来必要のない取得のほうにも"self."とつけるようにしています。



INDEX PAGE