我有一个现有的项目记录,我正在导入一个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?)
答案 0 :(得分: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?})
答案 1 :(得分:6)
如果需要,您可以从控制器执行此操作:
def some_params
params.permit(:foo, :bar).reject { |_, v| v.blank? }
end
在这种情况下,属性如果空白则不会保存
答案 2 :(得分:1)
这是一个老问题,但是对于记录,您还可以将属性设置为nil(而不是空白),以便将其从更新列表中排除。我不会将以下示例称为最佳实践,但我认为它可以帮助澄清后台发生的情况:update_attributes将仅尝试更新散列中提供的属性,具有非零值。
params[:csv] = nil if params[:csv].blank? or (arbitrary other condition)
# now update like normal
if @project.update_attributes(project_params)
...
etc.
答案 3 :(得分: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