¿Cómo borro las asociaciones :has_many de un modelo sin escribir en la base de datos en ActiveRecord?
Frecuentes
Visto 150 veces
1
Por el bien de esta pregunta, digamos que tengo un modelo muy simple:
class DystopianFuture::Human < ActiveRecord::Base
has_many :hobbies
validates :hobbies, :presence => {message: 'Please pick at least 1 Hobby!!'}
end
El problema es que cuando un humano está actualizando sus pasatiempos en un formulario y no elige ninguno, no hay forma de que refleje esto en el código sin eliminar todas las asociaciones.
Entonces, digamos que la acción se ve así:
def update
hobbies = params[:hobbies]
human = Human.find(params[:id])
#ideally here I'd like to go
human.hobbies.clear
#but this updates the db immediately
if hobbies && hobbies.any?
human.hobbies.build(hobbies)
end
if human.save
#great
else
#crap
end
end
Observe la línea human.hobbies.clear. Me gustaría llamar a esto para asegurarme de que solo estoy guardando los nuevos pasatiempos. Significa que también puedo comprobar si el usuario no ha marcado ningún pasatiempo en el formulario.
Pero no puedo hacer eso ya que borra la base de datos. No quiero escribir nada en la base de datos a menos que sepa que el modelo es válido.
¿Qué estoy haciendo mal aquí?
1 Respuestas
1
Inicialmente también hice esto de la misma manera. Entonces encontré una solución para este problema.
Necesitas hacer algo como esto
params[:heman][:hobby_ids]=[] if params[:human][:hobby_ids].nil?
Entonces revisa
if human.update_attributes(params[:human])
Espero que te des una idea...
EDIT:
Haz pasatiempos params como este
hobbies = { hobbies_attributes: [
{ title: 'h1' },
{ title: 'h2' },
{ title: 'h3', _destroy: '1' } # existing hobby
]}
if Human.update_atttributes(hobbies) # use this condition
Para ello es necesario declarar accepts_nested_attributes_for :hobbies, allow_destroy: true
en tu modelo Humano.
Ver más sobre esto aquí http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
Puedes probar https://github.com/ryanb/nested_form para este propósito..
Respondido el 02 de diciembre de 13 a las 10:12
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails-3 postgresql activerecord orm or haz tu propia pregunta.
Hmm, ¿no estoy seguro de que esto sea relevante para esta pregunta? O tal vez he entendido mal thaha. Hobbies es una asociación, no hay un atributo "hobby_ids", por lo que update_attributes no funcionará, ¿no? - Andy
Creo que en su caso, hobby_ids serán params[:hobbies](contienen los ids de hibbies seleccionados). El problema aquí es que en lugar de actualizar, está eliminando y luego creando. Eso necesita ser cambiado. - Thaha kp
También puedes hacerlo de esta manera... No recomendado... si aficiones && aficiones.alguna? human.hobbies.clear human.hobbies.create(hobbies) #genial otra cosa #mierda final - Thaha kp
no porque human.hobbies.clear escribirá en la base de datos. no quiero eso - Andy