[RUBY] Comment donner MAX + 1 ID aux données enregistrées lors de l'ajout d'un nouvel enregistrement

Lors de l'ajout d'un nouvel enregistrement avec Rails, il se peut que vous souhaitiez attribuer automatiquement un ID unique. Par exemple, donnez la valeur maximale +1 du champ my_id.

J'ai écrit un échantillon qui donne un identifiant unique = my_id lors de l'enregistrement du nom de la salle.

Succès

  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

Le point est

Exemple d'échec

  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

En cas d'échec, entre le début de la transaction et la validation de la transaction

  1. Instruction SELECT-> Pour rechercher Room.max (my_id)
  2. Pour l'instruction INSERT-> Room.create

Est émis, Exclusion insuffisante lorsque plusieurs clients appellent assigner en même temps my_id sera dupliqué

Réellement

Je veux vraiment écrire dans ActiveRecord sans émettre de SQL brut, N'y a-t-il pas un bon moyen?

URL de référence

Apportez la valeur de colonne maximale +1 au moment de INSERT Je veux faire MAX + 1 en même temps que l'instruction INSERT. Je veux enregistrer les données et émettre max au moment de INSERT Pour garantir que ActiveRecord find_or_create_by est exécuté

Recommended Posts

Comment donner MAX + 1 ID aux données enregistrées lors de l'ajout d'un nouvel enregistrement
Comment ajouter un nouveau hachage / tableau
Comment réparer un crash lors de la suppression de données de royaume dans la liste de l'interface utilisateur Swift
Comment effacer toutes les données d'une table particulière
[Java] Comment rompre une ligne avec StringBuilder
Comment obtenir le dernier ID de diffusion en direct pour une chaîne sans utiliser l'API de données YouTube
Comment laisser un commentaire
Comment insérer une vidéo
Comment créer une méthode
Éléments à prendre en compte lors du choix de l'architecture d'un nouveau système
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03