2009-10-07 22 views
5

Mam istniejący rekord projektu i importuję plik CSV, aby zaktualizować powiązane atrybuty projektu. Jednak często plik CSV będzie zawierał puste pola i nie chcę tworzyć atrybutów exisiting, jeśli powiązane pole CSV jest puste.Zaktualizuj atrybuty, chyba że puste?

coś takiego:

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

Odpowiedz

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

Nie bardzo czytelny; ( –

+0

Uzgodnione, w porównaniu do wybranego rozwiązania. – khelll

1

To stara sprawa, ale dla przypomnienia, można także ustawić atrybut do zera (w przeciwieństwie do puste) w celu wykluczenia to z listy aktualizacji. Nie nazwałbym poniższej przykładowej sprawdzonej metody, ale myślę, że może to pomóc w wyjaśnieniu, co dzieje się w tle: update_attributes będzie tylko próbować aktualizować atrybuty dostarczone w haśle, mając niezerową wartość.

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

Można to zrobić ze sterownika razie potrzeby:

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

W tym przypadku atrybuty nie zostaną zapisane jeśli są puste

Powiązane problemy