/// // Ein Fahrer hat einen Namen, nicht zwei. // // Vorname und Nachname getrennt zu führen versprach eine Ordnung, die es hier // nie gab: sortiert wird über den ganzen Namen, angezeigt wird der ganze Name, // gesucht wird über beides zugleich. Dafür musste jede Maske zwei Felder // anbieten und jede Anzeige sie wieder zusammensetzen — und wer schlicht // „Schorsch" heißt, stand vor der Frage, welches der beiden Felder das ist. // // Das Feld `name` gibt es an riders längst; es lag nur brach, weil die // Anwendung firstname und lastname benutzte. Es bleibt deshalb, wie es ist, // und bekommt nur den Inhalt der beiden anderen — kein neues Feld, keine // zweite Spalte, nichts, was auf bestehenden Instanzen erst entstehen müsste. // // Beim Zusammenlegen geht nichts verloren: firstname und lastname werden mit // einem Leerzeichen verbunden. Zurück geht es nur ungenau — die Umkehrung // trennt am ersten Leerzeichen und rät damit bei jedem Doppelvornamen falsch. // Das ist der Preis dafür, dass die Trennung überhaupt verschwindet. migrate((app) => { const riders = app.findCollectionByNameOrId('riders') // Erst zusammenführen, dann die alten Felder abräumen — andersherum wären // die Daten fort, bevor sie jemand liest. Auf einer frischen Datenbank hat // der Snapshot die beiden Felder gar nicht erst. if (riders.fields.getByName('firstname') || riders.fields.getByName('lastname')) { for (const rider of app.findRecordsByFilter('riders', 'id != ""', '', 0, 0)) { const merged = [rider.get('firstname'), rider.get('lastname')] .map((part) => (part || '').trim()) .filter(Boolean) .join(' ') // Ein bereits gefülltes `name` gewinnt: Es wäre von Hand gesetzt // worden und wüsste mehr als die beiden Bruchstücke. if (merged && !(rider.get('name') || '').trim()) { rider.set('name', merged) app.save(rider) } } } riders.fields.removeByName('firstname') riders.fields.removeByName('lastname') // Im Admin-UI steht ein Fahrer jetzt mit Namen statt mit seiner ID da. const name = riders.fields.getByName('name') if (name) name.presentable = true app.save(riders) }, (app) => { const riders = app.findCollectionByNameOrId('riders') if (!riders.fields.getByName('firstname')) { riders.fields.add(new Field({ id: 'text2208304744', name: 'firstname', type: 'text', presentable: true, })) } if (!riders.fields.getByName('lastname')) { riders.fields.add(new Field({ id: 'text824489398', name: 'lastname', type: 'text', presentable: true, })) } const name = riders.fields.getByName('name') if (name) name.presentable = false app.save(riders) // Am ersten Leerzeichen trennen: davor der Vorname, danach der Rest. Aus // „Anna Maria Huber" wird so „Anna" und „Maria Huber". for (const rider of app.findRecordsByFilter('riders', 'id != ""', '', 0, 0)) { const full = (rider.get('name') || '').trim() if (!full) continue const cut = full.indexOf(' ') rider.set('firstname', cut === -1 ? full : full.slice(0, cut)) rider.set('lastname', cut === -1 ? '' : full.slice(cut + 1).trim()) app.save(rider) } })