sankichi92/LiveLog

非ログインユーザに対し、メンバーの古い名前が表示される

Opened this issue · 2 comments

https://ku-livelog.slack.com/archives/CQLNA742J/p1676033377690089

LiveLogでログインしてない状態のとき、表示される名前が現在の名前じゃなくなるバグがあると思います
左の表記の時はバグる時があって、右の表記の時は正しく表示されるようです

1676033348686

該当箇所のコード:

- if current_user
= render @songs
- else
= render partial: 'songs/song', collection: @songs, cached: true

ログインユーザの場合、曲の公開範囲と自身が演奏しているかどうかでユーザごとに見え方が変わるため、2018年4月にキャッシュしないようにしていた: 43e2be8

Rails のフラグメントキャッシュの仕様上、対応する Song オブジェクトの updated_at が更新されていればキャッシュは失効する。が、フラグメントには Song だけでなく Play と Member オブジェクトの情報も含まれている。Play は以下の通り song アソシエーションに touch: true を設定しているため、更新があった場合に Song の updated_at も更新される。

belongs_to :song, touch: true

しかし、Member については更新があっても Song の updated_at は更新されない(多対多の関係なのでするべきでもなさそう)。そのため、報告にあったように Member の情報が更新されても、Song に紐づくフラグメントのキャッシュが失効せず、古い情報が表示されてしまうという事象が発生する。

ただ、これは当時の考慮漏れかというとそういうわけではない。プロフィールの編集機能が実装されたのは #680 の2019年11月で、当時はメンバーの名前(姓)は不変だった。よって、2019年11月のプロフィール機能実装以降、意図しない挙動になっていたようす。 #2072 (comment)

キャッシュを入れてパフォーマンスが改善するということもなさそうに見えるし、こういうバグの原因にもなるので、キャッシュやめるでよさそう。たぶん、当時フラグメントキャッシュという機能を知って使ってみたくなったとかそんな理由で入れた気がする……。

ただ、これは当時の考慮漏れかというとそういうわけではない。プロフィールの編集機能が実装されたのは #680 の2019年11月で、当時はメンバーの名前(姓)は不変だった。

これは記憶ちがいだった。#7 を見ると初期から名前の編集はあったっぽい。Song フラグメントに Member 情報が表示されるようになったのがそのあとだったかなと思ったけど、これも割と初期からありそう: 9ac969c#diff-4af48fdb10576e36bd17e41b0855b26a7d5b6b80c6394d21580b65f9b0a63fed

キャッシュ入れた時からの考慮漏れかな……。Member の名前はほとんど更新されないので全然気づかなかった。