2016-03-21 2 views
1

У меня есть форма редактирования массы. Пользователь выбирает несколько существующих записей. А затем нажимает кнопку, которая отображает новую форму записи (все значения пустые). Пользователь вводит некоторые данные для каждого атрибута, а затем нажимает кнопку submit, а затем обновляет все выбранные записи с указанными значениями.Обновление только атрибутов, которые не являются пустыми

Params хэш отправляется на сервер выглядит следующим образом:

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

Таким образом, в этом примере, только имя атрибут должен быть обновлен для свинца с идентификатором 2 и 4.

Это что я придумал:

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 способ сделать это?

ответ

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) 
+0

Это может быть немного чище, чтобы разорвать этот выход в 'обработке params', но это правильная идея. – tadman

+0

'hash = params [: lead]', но в противном случае это путь. – GoGoCarl

+0

@GoGoCarl: Хороший улов. – MTarantini

Смежные вопросы