¿ActiveRecord tiene una función de inserción incorporada? Sé que podría escribirlo yo mismo, pero obviamente no quiero si eso ya existe.Upsert in Rails ActiveRecord
Respuesta
Model.find_or_initialize
probablemente haga lo que quiera. Puede encadenarlo con save
o update_attributes
si tiene sentido.
Más información en el Rails Guides.
También hay Model.find_or_create
Esto no hace un upsert. Hace una selección y luego (opcionalmente) una inserción. Si bien obtienes el mismo efecto en un mundo con un solo subproceso, en un mundo con subprocesos múltiples, necesitarás que se haga un upsert real. – tybro0103
yo sólo encontré con esta biblioteca: https://github.com/seamusabshere/upsert
no he probado todavía, pero parece prometedor
que había escrito un blog el cómo podemos lograr esto. Verifique here.
Tendrá que escribir una extensión de registro activa. Se verá algo como esto.
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)
El mecanismo IMO Upsert requiere una configuración personalizada para cada modelo.
Así que la mejor solución sería implementar una consulta SQL personalizada para un modelo, p. Ej.
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. upsert a granel con Ruby on Rails
- 2. Ruby Activerecord IN cláusula
- 3. before_create in rails model
- 4. Rails association nil in after_initialize
- 5. Benchmarking rails ActiveRecord Queries
- 6. Eliminar ActiveRecord en Rails 3
- 7. Aplicación Themes in Rails
- 8. Helpers in Rails motor
- 9. Rubygems. LoadError in Rails
- 10. create_or_update method in rails
- 11. Sanitizing CSS in Rails
- 12. Sanitize Markdown in Rails?
- 13. Sprites in Rails 3.1
- 14. Rails/Activerecord database field timezone
- 15. Ruby on Rails ActiveRecord: pluralization
- 16. Rails 3 ActiveRecord conditional includes?
- 17. SQL UNION con Rails ActiveRecord
- 18. Rails encontrar recibiendo ActiveRecord :: RecordNotFound
- 19. Rails 3 incluye las traducciones globalize3 activerecord
- 20. ActiveRecord Rails 3 scope vs class method
- 21. Rails 3 Consulta de ActiveRecord utilizando operadores SQL IN y SQL OR
- 22. OO Design in Rails: Dónde poner cosas
- 23. script/runner in rails 3
- 24. Named_scope in rails unique records?
- 25. Print Rails version in views?
- 26. RESTful DCI contexts in Rails
- 27. attr_accessible in rails Active Record
- 28. Mangosta actualización/upsert?
- 29. Lista activada de Rails ActiveRecord Model
- 30. DataMapper vs ActiveRecord en Rails 3
ver comentario en la respuesta de Pasta – tybro0103
¿Alguien ha visto esto generar un postre? La guía de rieles indica que el nuevo objeto aún no se almacenará en la base de datos, por lo que no puedo ver cómo se trata de una verdadera actualización de DB. Es decir, no funcionará de manera confiable en un entorno de subprocesos múltiples. – stuckj
Esta solución tiene problemas de concurrencia. Fallará si otro hilo actualiza la tabla entre 'find_or_initialize' y' save'. –