🐡

Rails|保存の前処理をbefore validationで書かない

2021/04/30に公開

今回のシナリオ

Userモデルがあり、nameというカラムも持っている。
モデルを保存する前に状態によってnameの値を加工したい。

一般的?な方法

自分も含めよくあるやり方がbefore_validationを用いて行う方法。

class User < ApplicationRecord
  before_validation :fix_name
  validates :name ~~
  
  def fix_name
    self.name = anything_method1 if standard_type?
    self.name = anything_method1 if premium_type?
  end
end

これだとテストを書こうと思ったときにvalid?まで行わなければならないのでちょっと違和感があった。
前後の文脈に依存しているし、なによりもvalidatinの責任ではないのでは?

セッターを定義して前処理を行う

class User < ApplicationRecord
  def name=(value)
    write_attribute(:name, anything_method1) if standard_type?
    write_attribute(:name, anything_method2) if premium_type?
  end
end

こうすることで、他のカラムの状態を気にせずにModel.newをしたときの状態でテストを書くことが出来る。

Discussion