2016-03-21 11 views
1

私は一括編集フォームを持っています。ユーザーは複数の既存のレコードを選択します。そして、新しいレコードフォームを表示するボタンをクリックします(すべての値は空です)。ユーザーは属性ごとにデータを入力し、submitをクリックすると、選択したすべてのレコードが指定された値で更新されます。空でない属性のみを更新する

paramsをサーバーに送信ハッシュは次のようになります。

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

したがって、この例では、name属性だけがこれは2と4

のIDでリードするために更新する必要があります私が思いついたのは:

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) 

あなたは、リードを検索空の値とのペアを削除します。

もそれ2ライナー作るんでした:

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

関連する問題