2016-03-21 12 views
1

Ich habe ein Masseneditierformular. Ein Benutzer wählt mehrere vorhandene Datensätze aus. Und dann klickt auf eine Schaltfläche, die ein neues Datensatzformular anzeigt (alle Werte sind leer). Der Benutzer gibt einige Daten für jedes Attribut ein und klickt dann auf Senden, wodurch alle ausgewählten Datensätze mit den angegebenen Werten aktualisiert werden.Nur Attribute aktualisieren, die nicht leer sind

Der params-Hash an den Server gesendet sieht wie folgt aus:

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

So in diesem Beispiel nur das Namensattribut für Blei mit einer ID von 2 aktualisiert werden soll und 4.

Dies ist was ich kam mit:

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 

gibt es einen Railsy Weg, dies zu tun?

Antwort

2

Ich würde den Code in etwas ein bisschen sauberer Refactoring, wie folgt aus:

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

Sie für die Leitungen suchen, die Paare mit leeren Werten entfernen, dann aktualisieren Sie die Kabel mit dem Hash.

Könnte es sogar machen einen Zweizeiler:

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

Es könnte ein wenig sauberer sein, dies in der 'params' Verarbeitung auszubrechen, aber das ist die richtige Idee. – tadman

+0

'hash = params [: lead]', aber sonst ist dies der Weg zu gehen – GoGoCarl

+0

@GoGoCarl: Guter Fang. – MTarantini

Verwandte Themen