更新属性,除非空白?

时间:2009-10-07 11:27:37

标签: ruby-on-rails ruby activerecord

我有一个现有的项目记录,我正在导入一个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?)

4 个答案:

答案 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