【Rails】setterをオーバーライドする

こんにちは、技術部のNです。 カラムの値を更新するsetterにその他の処理を追加したい時、setterをオーバーライドする方法で実装をしたのでご紹介します。
Userモデルにname, user_numberカラムがあったとします。 nameとuser_numberを更新するupdateメソッドがあります。
				
					class User < ApplicationRecord
  def update(name, user_number)
    transaction do
      self.name = name
      self.user_number = user_number
      save!
    end
  end
end
				
			
例えばここで、Userモデルにuser_codeカラムが追加され、user_codeはuser_numberの末尾に00を足したStringだとします。 もちろん下記のように記載することもできますが、
				
					class User < ApplicationRecord
  def update(name, user_number)
    transaction do
      self.name = name
      self.user_number = user_number
      self.user_code = user_number.to_s + ‘00’
      save!
    end
  end
end
				
			
下記のように記載すると、setterをオーバーライドして、モデルsetter側でuser_codeに保存する形にできます。
				
					class User < ApplicationRecord
  def update(name, user_number)
    transaction do
      self.name = name
      self.user_number = user_number
      save!
    end
  end

  def user_number=(number)
    self[:user_number] = number
    self.user_code = number.to_s + ‘00’
  end
end

				
			
この時、self[:user_number] = number の部分を、self.user_number = としてしまうと無限ループしてしまうので注意です。 以上です。 最後までお読みいただきありがとうございました。

スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank