2017-11-09 2 views
0

私はいくつかのコードを繰り返し処理するためのDRY方法を探しています。私はUserモデルを持っていて、モデル(報告用)に特定のUsersを数えたいと思っています。Rails - 複数の配列を繰り返す

User.namesの値を定義しています(つまり、「Jan」、「Lisa」、「Tina」)。リストが3つの値よりもずっと長いので、このコードをもっとDRYにするにはどうすればよいですか?

@users = User.all 
@users.each do |u| 

    # this part repeats with different names 
    quantity = u.where("name = ?", "Jan").count 
    ReportRecord.create(:user_id => u.id, :name => "Jan", :quantity => quantity) 

    # repeated code with different name 
    quantity = u.where("name = ?", "Lisa").count 
    ReportRecord.create(:user_id => u.id, :name => "Lisa", :quantity => quantity) 

    # repeated code with different name 
    quantity = u.where("name = ?", "Tina").count 
    ReportRecord.create(:user_id => u.id, :name => "Tina", :quantity => quantity) 

end 

答えて

3

私が最初に(1つのクエリの代わりに、3)すべてのユーザーを合計します:

quantity_by_name = User.select(:name).where(name: %w(Jan List Tina)) 
         .group(:name).sum(:quantity) 
#=> { 'Lisa' => 1, 'Jan' => 2, 'Tina' => 3 } 
quantity_by_name.each do |name, quantity| 
    ReportRecord.create(name: name, quantity: quantity) 
end 
2
names = %w(Jan List Tina) 

names.each do |name| 
    count = User.where(name: name).count 
    ReportRecord.create(name: name, quantity: count) # I don't understand `u.id` 
end