2009-10-07 17 views
5

Ho un record di progetto esistente e sto importando un file CSV per aggiornare gli attributi di progetto associati. Tuttavia, spesso il CSV conterrà campi vuoti e non desidero esplicitamente attribuire attributi se il campo CSV correlato è vuoto.Aggiorna attributi a meno che non sia vuoto?

Qualcosa di simile a questo:

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

risposta

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

molto facilmente leggibile; ( –

+0

Concordato, rispetto alla soluzione scelta. – khelll

1

Questa è una vecchia questione, ma per la cronaca, è anche possibile impostare un attributo a zero (al contrario di bianco) al fine di escludere dalla lista degli aggiornamenti. Non chiamerei la seguente best practice di esempio, ma penso che possa aiutare a chiarire cosa sta succedendo in background: update_attributes tenterà solo di aggiornare gli attributi forniti nell'hash, con un valore non nullo.

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

È possibile farlo dal controllore se necessario:

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

In questo caso gli attributi non saranno salvati se sono vuote

Non
Problemi correlati