ActiveRecord dispone di una funzionalità di upsert incorporata? So che potrei scriverlo da solo ma ovviamente non voglio se esiste già una cosa del genere.Upsert in Rails ActiveRecord
risposta
Model.find_or_initialize
probabilmente fa quello che vuoi. Puoi concatenarlo con save
o update_attributes
se questo ha senso.
Ulteriori informazioni nello Rails Guides.
C'è anche Model.find_or_create
Questo non fa un upsert. Fa un select e poi (opzionalmente) un insert. Mentre ottieni lo stesso effetto in un mondo a thread singolo, in un mondo a più thread, ti servirà per eseguire un upsert effettivo. – tybro0103
Ho appena imbattuto in questa biblioteca: https://github.com/seamusabshere/upsert
non l'ho ancora provato, ma sembra promettente
avevo scritto un post sul blog come possiamo ottenere questo. Dai un'occhiata a here.
Dovrai scrivere un'estensione di registrazione attiva. Assomiglierà a questo.
module ActiveRecordExtension
extend ActiveSupport::Concern
def self.upsert(attributes)
begin
create(attributes)
rescue ActiveRecord::RecordNotUnique, PG::UniqueViolation => e
find_by_primary_key(attributes['primary_key']).
update(attributes)
end
end
end
ActiveRecord::Base.send(:include, ActiveRecordExtension)
Il meccanismo IMO Upsert richiede una configurazione personalizzata per ciascun modello.
Quindi la soluzione migliore sarebbe implementare una query SQL personalizzata per un modello, ad es.
insert into <table> (<field_1>, ..., <field_n>)
values (<field_1_value>, ..., <field_n_value>)
on duplicate key update
field_x = field_x_value,
...
field_z = field_z_value;
- 1. Bulk upsert con Ruby on Rails
- 2. Campo temporale database Rails/Activerecord
- 3. rails ActiveRecord :: Observer nel plugin
- 4. Rails has_many ActiveRecord Association personalizzato
- 5. Rails 5: ActiveRecord OR query
- 6. Rails ActiveRecord Model Linked List
- 7. Inserimento o incremento atomico in ActiveRecord/Rails
- 8. salvataggio da ActiveRecord :: RecordNotFound in Rails
- 9. O & ed in Rails ActiveRecord clausola where
- 10. DataMapper vs ActiveRecord in Rails 3
- 11. In ActiveRecord di Rails, a cosa serve?
- 12. UNIONE SQL con Rails ActiveRecord
- 13. Ruby on Rails ActiveRecord: pluralization
- 14. Rails 3 Condizionale ActiveRecord include?
- 15. Rails ActiveRecord tavolo multiplo include
- 16. Upsert in Mongoide
- 17. Rails (ActiveRecord) tabella molti a molti
- 18. Rails ActiveRecord Cerca con operatori logici
- 19. Rails 3 - ActiveRecord e invertire sorta
- 20. Rails/ActiveRecord che funzionano con mysql BIT
- 21. Rails/ActiveRecord - AdapterNotSpecified, anche se è
- 22. Rails 4, query non elaborata con ActiveRecord
- 23. Rails ActiveRecord fuga variabile nella clausola join
- 24. Aggiornamento collettivo/upsert in MongoDB?
- 25. 'upsert' in un documento incorporato
- 26. Come utilizzare ActiveRecord all'esterno di Rails?
- 27. Ruby on Rails/ActiveRecord e Table Partitions
- 28. Rails ActiveRecord - Ricerca su più attributi
- 29. Rails: ricerca chiave esterna non idattiva ActiveRecord
- 30. Rails: sovrascrivere il metodo di associazione ActiveRecord
vedere il commento sulla risposta di Pasta – tybro0103
Qualcuno ha visto questo generare un upsert? La guida dei binari indica che il nuovo oggetto non sarà ancora memorizzato nel DB, quindi non posso vedere come questo sia un vero upsert di DB. Ad esempio, non funzionerà in modo affidabile in un ambiente multi-thread. – stuckj
Questa soluzione ha problemi di concorrenza. Fallirà se un altro thread aggiorna la tabella tra 'find_or_initialize' e' save'. –