Ruby on rails 仅更新不为空的属性

Ruby on rails 仅更新不为空的属性,ruby-on-rails,Ruby On Rails,我有一个批量编辑表单。用户选择多个现有记录。然后单击显示新记录表单的按钮(所有值均为空)。用户为每个属性输入一些数据,然后单击提交,然后用指定的值更新所有选定的记录 提交到服务器的params散列如下所示: { 'lead_ids' => [2,4] 'lead' => { 'name' => 'donato', 'email' => "", 'phone' => "" } } leads = Lead.where(id: pa

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

提交到服务器的params散列如下所示:

{
  'lead_ids' => [2,4]
  'lead' => {
    'name' => 'donato',
    'email' => "",
    'phone' => ""
  }
}
leads = Lead.where(id: params[:lead_ids])
hash = lead_params.reject { |k, v| v.blank? }
leads.update_all(hash)
因此,在本例中,id为2和4的lead只应更新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

有没有一种更具讽刺意味的方法可以做到这一点?

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

{
  'lead_ids' => [2,4]
  'lead' => {
    'name' => 'donato',
    'email' => "",
    'phone' => ""
  }
}
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)

params
处理中解决这个问题可能会更干净一些,但这是正确的想法。
hash=params[:lead]
,否则这就是解决问题的方法go@GoGoCarl:接得好。