[RUBY] So geben Sie registrierten Daten beim Hinzufügen eines neuen Datensatzes die MAX + 1-ID

Wenn Sie einen neuen Datensatz mit Rails hinzufügen, kann es vorkommen, dass Sie automatisch eine eindeutige ID zuweisen möchten. Geben Sie beispielsweise den Maximalwert +1 des Felds my_id an.

Ich habe ein Beispiel geschrieben, das bei der Registrierung des Raumnamens eine eindeutige ID = my_id angibt.

Erfolgsgeschichte

  def assign
    my_id = -1
    room = Room.find_by(room: params[:room])
    if !room.nil?
      my_id = room.my_id
    else
      Room.connection.execute(
        "INSERT INTO rooms (my_id, room, created_at, updated_at) SELECT COALESCE(max(my_id), 0)+1, '#{params[:room]}', '#{Time.now}', '#{Time.now}' from rooms"
      )
      my_id = Room.find_by(roomr: params[:room]).my_id
    end
    redirect_to("/rooms/#{my_id}")
  end

Der Punkt ist

Fehlerbeispiel

  def assign
    my_id = -1
    room = Room.find_by(room: params[:room])
    if !room.nil?
      my_id = room.my_id
    else
      new_room = Room.create(
        my_id: Room.max(my_id) + 1,
        room: params[:room]
      )
      my_id = new_room.my_id
    end
    redirect_to("/rooms/#{my_id}")
  end

Im Fehlerfall zwischen Transaktion starten und Transaktion festschreiben

  1. SELECT-Anweisung-> Nach Room.max suchen (my_id)
  2. Für INSERT-Anweisung-> Room.create

Wird ausgestellt, Unzureichender Ausschluss, wenn mehrere Clients gleichzeitig die Zuweisung anrufen my_id wird dupliziert

Tatsächlich

Ich möchte wirklich in ActiveRecord schreiben, ohne unformatiertes SQL auszugeben. Gibt es keinen guten Weg?

Referenz-URL

Bringen Sie den maximalen Spaltenwert +1 zum Zeitpunkt des EINFÜGENS mit Ich möchte MAX + 1 gleichzeitig mit der INSERT-Anweisung ausführen. Ich möchte Daten registrieren und max zum Zeitpunkt von INSERT ausgeben Um sicherzustellen, dass ActiveRecord find_or_create_by ausgeführt wird

Recommended Posts

So geben Sie registrierten Daten beim Hinzufügen eines neuen Datensatzes die MAX + 1-ID
So fügen Sie einen neuen Hash / Array hinzu
So beheben Sie einen Absturz beim Löschen von Realm-Daten in der Liste der schnellen Benutzeroberfläche
So löschen Sie alle Daten in einer bestimmten Tabelle
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
So erhalten Sie die neueste Live-Übermittlungs-ID für einen Kanal ohne Verwendung der YouTube-Daten-API
Wie hinterlasse ich einen Kommentar?
So fügen Sie ein Video ein
So erstellen Sie eine Methode
Dinge, über die Sie nachdenken sollten, wenn Sie sich für die Architektur eines neuen Systems entscheiden
So erstellen Sie ein neues Gradle + Java + Jar-Projekt in Intellij 2016.03