2009-10-07 9 views
5

Tengo un registro de proyecto existente y estoy importando un archivo CSV para actualizar los atributos de proyecto asociados. Sin embargo, a menudo el archivo CSV contendrá campos en blanco y no quiero exceder los atributos existentes si el campo CSV relacionado está en blanco.¿Actualizar atributos a menos que estén en blanco?

Algo como esto:

project.update_attributes(:name => row.field('project_name') unless row.field('project_name').blank?,            
          :owner => row.field('project_owner') unless row.field('project_owner').blank?, 
          :due_date => row.field('project_due_date') unless row.field('project_due_date').blank?) 

Respuesta

23
project.update_attributes({:name => row.field('project_name'),                   
          :owner => row.field('project_owner'), 
          :due_date => row.field('project_due_date')}.reject{|k,v| v.blank?}) 
0
attrs = [:name,:owner,:due_date].inject({}) {|res,obj| res[obj] = row.field("project_#{obj}") unless row.field("project_#{obj}").blank? } 
project.update_attributes attrs 
+2

muy fácil de leer; ( –

+0

de acuerdo, en comparación con la solución elegida. – khelll

1

Ésta es una cuestión de edad, sino también para el registro, también puede establecer un atributo a cero (en lugar de en blanco) con el fin de excluir de la lista de actualizaciones. No me gustaría llamar al siguiente ejemplo de práctica recomendada, pero creo que puede ayudar a aclarar lo que está sucediendo en segundo plano: los atributos de actualización solo intentarán actualizar los atributos que se proporcionan en el hash, que tienen un valor que no es nada.

params[:csv] = nil if params[:csv].blank? or (arbitrary other condition) 
# now update like normal 
if @project.update_attributes(project_params) 
    ... 
etc. 
1

Usted puede hacer esto desde el controlador si es necesario:

def some_params 
    params.permit(:foo, :bar).reject { |_, v| v.blank? } 
end 

En este caso, los atributos no se guardarán si están en blanco

No
Cuestiones relacionadas