MySQL a une très belle option pour l'instruction INSERT
, ce qui est particulièrement utile pour les tables jointes sans la colonne id
. Il insère un enregistrement, mais, au lieu de lancer une erreur si sa clé est en conflit avec la clé existante, cet enregistrement est mis à jour. Voici un exemple:Comment mettre à jour un enregistrement existant si celui en cours d'enregistrement a la même clé?
INSERT INTO table (key1,key2,data) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE data=3;
Comment réaliser la même chose avec Active Record? Le code résultant serait alors ressembler à ceci:
class Model < ActiveRecord::Base
belongs_to :key1
belongs_to :key2
end
record = Model.new
record.key1 = key1
record.key2 = key2
record.data = 'new data'
record.WHAT? #Inserts or updates `data` for the existing record
Votre solution n'est pas très performante. Lorsque 'save' échoue, il peut également annuler une transaction de taille notable et les données doivent être rechargées. Quant à MySQL, désolé, corrigé la question. –
'find' par lui-même retournera' AR :: RecordNotFound', tandis que 'find_by_ *' retournera 'nil'. – theIV