【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 = としてしまうと無限ループしてしまうので注意です。 以上です。 最後までお読みいただきありがとうございました。
関連記事
- 2022-12-22
- テクノロジー