Sto lavorando a un'applicazione Rails 3.2.8 che utilizza un'API REST homegrown per inserire nuovi dati. La logica di inserimento è generica per ogni endpoint e si traduce semplicemente in una chiamata a Model.save.Rails Sovrascrivi Salva per eseguire l'aggiornamento selettivo
Per uno dei tipi di modello, vorrei innanzitutto verificare se esiste un record preesistente e, in tal caso, aggiornare anziché inserire. Se il codice mi permettesse di interagire a livello di Controller, sarebbe facile usare find_or_create_by, tuttavia (credo) la mia unica opzione è di sovrascrivere il metodo di salvataggio nel Modello o usare un callback before_save.
Non riesco a trovare un modo per farlo funzionare, poiché qualsiasi chiamata a salvare o update_attributes all'interno del modello genera semplicemente un ciclo infinito (per ovvi motivi).
C'è un modo per utilizzare before_save o per sovrascrivere il salvataggio in modo tale da poter prima controllare se esiste un record con attributi xey e se sì recuperare quel record ed eseguire l'aggiornamento, altrimenti andare avanti con un ActiveRecord standard risparmia?
Ecco il mio codice nella sua forma attuale all'interno del modello di attività, che non funziona a causa della questione ciclo infinito:
def save
a = UserActivity.find_or_initialize_by_user_id_and_activity_id(user_id: user_id, activity_id: activity_id)
a.update_attributes start_at: start_at, end_at: end_at.....
end
mi sento come l'editing 'save' potrebbe aprire un'intera scatola di worms di problemi delicati con database. Hai considerato semplicemente di usare le istruzioni 'if - else' insieme a' update_attributes' e 'save'? –