¿Cómo borro las asociaciones :has_many de un modelo sin escribir en la base de datos en ActiveRecord?

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í?

preguntado el 02 de diciembre de 13 a las 08:12

1 Respuestas

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.