forse alcuni esperti di rubini là fuori possono far luce su come activerecord sa come fare un inserimento o aggiornamento quando chiama save(). qual è la logica dietro? controlla se la chiave primaria è vuota o qualcosa del genere e in tal caso un inserto, se non un aggiornamento?come fa activerecord a sapere di eseguire un inserimento o un aggiornamento?
risposta
Mentre è bene per alcune persone a dire "RTFM" Ho piuttosto il più walk-through-ma-ancora-entirely- inutili, quando-Rails-3-viene-out-and-cambiamenti-tutto di risposta:
Come funziona in Rails 2.3 (alias "oggi")
save
chiama 012.che assomiglia a questo:
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : update
result != false
end
È possibile ignorare la prima linea di questo metodo in quanto si solleva solo un errore se il record è di sola lettura (di solito non è, ma nel caso di join può essere) . Quello che ci interessa qui è la seconda e la terza riga all'interno del metodo.
La seconda linea chiama new_record?
che è definita come questo:
# Returns true if this object hasn't been saved yet -- that is, a record for the object doesn't exist yet; otherwise, returns false.
def new_record?
@new_record || false
end
e la variabile @new_record
è impostato quando il initialize
(new
chiamate initialize
, e ci dà un nuovo oggetto, alcuni retroscena di Ruby-fu qui) il metodo è chiamato.
Quindi, se questo è @new_record
true
lo chiameremo create
e se è falso che chiameremo update
che ci porta a quello che stai dopo, credo.
Inoltre, quando si trova un record non chiama initialize
e pertanto non imposta @new_record
. Se hai notato, il codice dietro new_record?
era @new_record || false
, il che significa che restituirà false se @new_record
non è stato impostato.
Diciamo ad esempio che si desidera trovare l'ultimo record Forum
, quindi si dovrebbe fare Forum.last
.
- Questo chiama il metodo
last
sulla classeForum
, che eredita da ActiveRecord :: Base last
calls il metodo della classefind
.find
callsfind_last
find_last
callsfind_initial
find_initial
callsfind_every
find_every
callsfind_by_sql
- e
find_by_sql
chiamateinstantiate
Vedrai qui che da nessuna parte lungo questa modifica è impostato @new_record
e quindi qualsiasi record ottenuto da find
non sarà un nuovo record.
Spero che questo ti aiuti a capire.
risposta molto bella e ti penso per il tempo che ti ho dedicato per scriverlo. sono anche interessato a sapere cosa impostare @nw_record su false? eseguire una ricerca lo farebbe se estrasse un record dal database? – rip747
Ho aggiornato il post con la catena di metodi di ricerca. –
Esiste comunque la possibilità di modificare da soli l'attributo "new_record" –
Principalmente si basa sul metodo new_record?.
Questo metodo restituisce true se è un nuovo record e false se non lo è.
In effetti non è molto difficile.
- Quando si ottiene un record esistente, non è nuovo. Quindi
new_record?
può restituire direttamente false. - Quando si crea un nuovo record (
Model.new
),new_record?
restituirà true. È un nuovo record. - Quando salvi quel nuovo record, non è più nuovo. La variabile interna
@new_record
viene aggiornata.new_record?
non restituirà più true.
Per vedere quando accade, andare a ActiveRecord::Base, linea 2911
self.id ||= new_id
@new_record = false
id
end
Stai collegando al master quando probabilmente usa 2.3. –
Ciò non cambia la mia argomentazione. Ma ho comunque aggiornato il collegamento. –
- 1. Come fa C# a sapere quando eseguire un costruttore statico?
- 2. Inserimento o aggiornamento di NHibernate
- 3. Inserimento o incremento atomico in ActiveRecord/Rails
- 4. come faccio a sapere se un aggiornamento o un inserimento ha avuto successo in dynamoDB utilizzando l'SDK Java?
- 5. Come eseguire un inserimento/aggiornamento con i dati principali
- 6. Come eseguire l'upster (aggiornamento o inserimento) in SQL Server 2005
- 7. Inserimento di massa O aggiornamento con ibernazione?
- 8. Creazione o aggiornamento di un has_one Associazione ActiveRecord
- 9. Inserimento o aggiornamento di Slick 3.0 (upsert)
- 10. Come faccio a fare un inserimento o aggiornamento di massa con SQLAlchemy?
- 11. T-SQL Inserimento o aggiornamento
- 12. Come fa un processo node.js a sapere quando fermarsi?
- 13. Inserimento/aggiornamento bulk del server SQL in MERGE nello scenario di inserimento o aggiornamento
- 14. Sospensione, inserimento o aggiornamento senza selezionare
- 15. Funzione inserimento o aggiornamento PHP PDO semplice
- 16. Inserimento batch ActiveRecord (yii2)
- 17. Come fa il compilatore Rust a sapere se un valore è stato spostato o meno?
- 18. Come si determina se un inserimento o un aggiornamento ha avuto successo utilizzando Java e MySQL?
- 19. Inserimento della logica di aggiornamento nelle migrazioni
- 20. Un trigger AFTER in Postgres blocca un inserimento/aggiornamento?
- 21. Come fa IIS a sapere se sta servendo un sito Web o un progetto di applicazione Web?
- 22. Come fa Python a sapere che un blocco di codice è in un ciclo?
- 23. Come sapere se un modello è nuovo o no?
- 24. Come fa un processo a sapere che ha ricevuto un segnale
- 25. Come fa un contenitore a sapere quando un bambino ha chiamato InvalidateArrange?
- 26. Come fa il lettore RSS a sapere che un feed è aggiornato?
- 27. Come fa un browser a sapere se un sito supporta HTTP/2?
- 28. Come fa il framment shader a sapere quale variabile usare per il colore di un pixel?
- 29. Come fa una pagina di asp.net a sapere quale pulsante ha attivato un postback?
- 30. Come fa UIView nextResponder a sapere cos'è UIViewController?
Ottima domanda. –