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