Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
update_columnsについて無知だった話
Search
Tetsu Nishimura
May 29, 2025
0
41
update_columnsについて無知だった話
Tetsu Nishimura
May 29, 2025
Tweet
Share
More Decks by Tetsu Nishimura
See All by Tetsu Nishimura
Railsフロントエンド移行効率化 ためAエージェント利用方法
kitsunecat
0
14
生成AIで仕事をどうにかして怠ける話
kitsunecat
0
44
懺悔LT
kitsunecat
0
35
書きながら考えないRSpec
kitsunecat
0
130
rake taskでメソッド定義したらテストが不安定になった
kitsunecat
0
78
ツクリンクで実践している 画像処理
kitsunecat
0
12
ツクリンクで実践している画像処理(フロー部分)
kitsunecat
0
180
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
89
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Odyssey Design
rkendrick25
PRO
2
550
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
180
Done Done
chrislema
186
16k
Building an army of robots
kneath
306
46k
How to build a perfect <img>
jonoalderson
1
5.3k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
280
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Transcript
© Tsukulink Inc. update_columnsについて無知だった話 #つくてくトーク
自己紹介 なまへ:にしむらてつ 趣味:スノーボード、クライミング、スキューバダイビング すんでるとこ:長野県 おしごと:ツクリンクでは非機能面の改善、フロントエンドリアーキを担当 好きな言語・技術:Rust, TypeScript, TCP/IP(Routing, Swiching,
QoS)
今日お話すること - update_columnsでDateを保存したのにnilになった話 - update_columnsで何がおきているか - 内部の型キャストの仕組みを軽くざっくり - 対処法
概要 ツクリンクDB (PostgreSQL) ツクリンクAPP Salesforce 契約情報 顧客情報など 契約情報 顧客情報など >
# DB情報を更新 > model.update_column(hoge: fuga) > > # Salesforceに同期 > salesforce.sync!(model) => 日付情報が同期されていなかった
現象再現(コード) > model = Model.find(xxx) > target_date = Date.new(2025,
5, 1) > model.update_columns(somedate_at: target_date) > # somedate_at: datetime型 > model.somedate_at => nil # 更新されたのにnilになっている このあとこのデータをつかってSalesforceにも同期をかけている
でもDBには保存されている > model = Model.find(xxx) > target_date = Date.new(2025,
5, 1) > model.update_columns(somedate_at: target_date) > model.somedate_at => nil > model.reload.somedate_at => Thu, 01 May 2025 00:00:00 JST +09:00 # DBには保存されている
キャストの問題でした ActiveRecord - update_columns は ActiveRecord の型変換をスキップしてキャッシュ -
キャスト済の値としてSQLに突っ込まれる - Date は datetime に自動変換されない - モデル内では型変換に失敗 → nil 扱いされる PostgreSQL - update_columnsから型変換されないまま更新リクエストを受ける - 各カラムについてPostgreSQLが型変換して値を更新 結果 - ActiveRecordには型変換されない値がキャッシュされる - PostgreSQLには正常に型変換されて書き込まれる
before_type_castは返ってくる > model = Model.find(xxx) > target_date = Date.new(2025,
5, 1) > model.update_columns(somedate_at: target_date) > model.somedate_at => nil > model.somedate_at_before_type_cast => Thu, 01 May 2025 # キャストしないで読み取ると値が返ってくる つまり内部的には値を持っているけど、somedate_at は nil(型変換できなかった)
Railsのコードレベルでは? - update_columns実行時 - write_cast_value 経由で(キャスト済の値として)型付き属性に直接値を書き込む - model.somedate_at実行時
- 型変換は ActiveModel::Type::DateTime で実行
どんな時に起きる? - update_columns で Date を直接保存 - saveやupdateでは型変換してキャッシュされる
- datetime カラムに対して Time ではない値を入力したとき - 読み込み時にActiveRecord がキャストできない値 => nil キャッシュ ツクリンクAPP update_columns PostgreSQL 型変換 値そのまま
対処方法 > # Timeにしてからupdate_columnsに渡す > model.update_columns( > somedate_at: target_date.to_time
> ) # または > model.update_columns( > somedate_at: Time.zone.local(2025, 5, 1) > )
まとめ - update_columns は型変換されない - update_columnsを使うときは型に注意しましょうぞ - PostgreSQLは型変換頑張ってくれてた
ありがとうございました