2009-10-07 6 views
5

Ich habe einen vorhandenen Projektdatensatz und ich importiere eine CSV-Datei, um die zugehörigen Projektattribute zu aktualisieren. Allerdings enthält die CSV-Datei häufig leere Felder, und ich möchte vorhandene Attribute nicht überschreiben, wenn das zugehörige CSV-Feld leer ist.Update-Attribute, sofern nicht leer?

Etwas wie folgt aus:

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

Antwort

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

leer sind nicht sehr gut lesbar; ( –

+0

Vereinbart, im Vergleich zu der ausgewählten Lösung. – khelll

1

Dies ist eine alte Frage, aber der Ordnung halber, können Sie auch ein Attribut auf Null gesetzt (im Gegensatz zu leeren Gegensatz), um auszuschließen, es aus der Liste der Updates. Ich würde das folgende Beispiel nicht als Best Practice bezeichnen, aber ich denke, es hilft dabei, zu klären, was im Hintergrund passiert: update_attributes versucht nur Attribute zu aktualisieren, die im Hash enthalten sind und einen Nicht-Null-Wert haben.

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

Sie dieses vom Controller tun können bei Bedarf:

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

In diesem Fall sind die Attribute wird nicht gespeichert werden, wenn sie

Verwandte Themen