2009-10-07 78 views
5

我有一個現有的項目記錄,我正在導入一個CSV文件來更新關聯的項目屬性。但是,CSV通常會包含空白字段,如果相關的CSV字段爲空白,我不想超出現有屬性。更新屬性,除非空白?

事情是這樣的:

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

回答

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

不是很容易讀取; ( – 2009-10-07 13:19:46

+0

同意,與挑選的解決方案相比。 – khelll 2009-10-08 03:21:47

1

這是一個老問題,但備案,也可以設置成零的屬性(而不是空白)爲了排除它來自更新列表。我不會調用下面的示例最佳實踐,但我認爲它可以幫助您澄清後臺發生了什麼:update_attributes只會嘗試更新散列中提供的屬性,並且具有非零值。

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

您可以從控制器如果需要做

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

在這種情況下,屬性不會被保存,如果他們是空白