仅更新非空的属性

时间:2016-03-21 20:56:49

标签: ruby-on-rails

我有一个批量编辑表格。用户选择多个现有记录。然后单击显示新记录表单的按钮(所有值均为空)。用户为每个属性输入一些数据,然后单击“提交”,然后使用指定的值更新所有选定的记录。

提交给服务器的params哈希看起来像这样:

{
  'lead_ids' => [2,4]
  'lead' => {
    'name' => 'donato',
    'email' => "",
    'phone' => ""
  }
}

因此,在此示例中,只应为id为2和4的潜在客户更新name属性。

这就是我提出的:

lead = Lead.new lead_params
leads = Lead.where(id: params[:lead_ids])
changed_attrs = lead_params.select {|param| !param.values.first.blank?}
leads.each do |lead|
  lead.update_attributes changed_attrs    
end

是否有更多Railsy方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

我会将代码重构为更清洁的东西,比如:

leads = Lead.where(id: params[:lead_ids])
hash = lead_params.reject { |k, v| v.blank? }
leads.update_all(hash)

您搜索潜在客户,删除具有空值的对,然后使用该哈希值更新所有潜在客户。

甚至可以使它成为两个班轮:

hash = lead_params.reject { |k, v| v.blank? }
Lead.where(id: params[:lead_ids]).update_all(hash)