Christian Kruse: Jährlings-Badge

Beitrag lesen

Hallo zusammen,

heute sind die Jährlings-Badges ein paar mal hust vergeben worden. Das war ein Bug in der Foren-Software, der hervorgerufen wurde durch eine fehlerhaft generierte SQL-Query.

Im User-Model definiere ich den Zusammenhang zwischen Usern und Badges so:

  has_many :badge_users, -> { order(:created_at) }, dependent: :delete_all,
                                                    foreign_key: :user_id
  has_many :badges, through: :badge_users

Das führt dazu, dass die Liste der User bei den Badges immer aufsteigend nach Datum sortiert ist, weil die Abfrage nach badge_users immer aufsteigend sortiert ist nach created_at. Nun habe ich aber, um zu prüfen, wann der letzte Jährlings-Badge vergeben wurde, folgenden Code verwendet:

        last_yearling = user
                          .badge_users
                          .where(badge_id: yearling.badge_id)
                          .order(created_at: :desc)
                          .first

Da aber das eine composable query ist, wurde das Sortieren aus dem User-Model nicht überschrieben sondern ergänzt, so dass diese Query dabei rauskam:

SELECT "badges_users".*
FROM "badges_users"
WHERE 
    "badges_users"."user_id" = 1
  AND
    "badges_users"."badge_id" = 13
ORDER BY
  "badges_users"."created_at" ASC,
  "badges_users"."created_at" DESC
LIMIT 1

Statt also den letzten Jährlings-Badge herauszusuchen wurde immer wieder der gleiche Jährlings-Badge von letztem Jahr, als das Feature eingeführt wurde, herausgesucht.

Ich habe das vorhin gefixed (ein Deployment über Edge, argh, was für ein Krampf), aber die überflüssigen Badges werde ich wohl erst Freitag oder Samstag löschen können, da ich morgen einen großen Teil des Tages in Besprechungen verbringen werde und den Rest des Tages im Auto sitzen werde…

Danke an die Problem-Melder 😀

LG,
CK