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.
  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
  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
Est émis, Exclusion insuffisante lorsque plusieurs clients appellent assigner en même temps my_id sera dupliqué
Je veux vraiment écrire dans ActiveRecord sans émettre de SQL brut, N'y a-t-il pas un bon moyen?
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