1

見た目はひどいですが、しばらくは機能しました。しかし、今ではユーザー数が非常に多くなり、システムはそれがどこにあったかを正確に「忘れ」始めました (データベースへの接続が失われました)。このネストされたループを書き直すためのベスト プラクティスは何ですか?

User.all.each_with_index do
 get Subset of criteria to select data
 Subset1.each do
  getSubset2
   Subset2.each do
    getSubset3
     Subset3.each do
      getSubset4
       Subset4.each do
        compute something
         open file A
          create or update a line
         end
        end
       end
     end
   end 
end

編集: サブセットは、クエリまたは事前定義された配列のいずれかです。提案どおりに組み合わせようとしていますが、brbします

User.all.each_with_index do |user|
 Subset1.each do |parameter1|
   Subset2(function(user,parameter1)).each do |object2|
     Subset3.each do |parameter3|
       getSubset4(user, parameter1, object2, parameter3)
         Subset4.each do |data|
          p data
         end
     end
   end
 end
end 
4

2 に答える 2

1
subset1 = %w(a b c )
subset2 = %w(d e f g )
subset3 = [1,2,3,4,5]

subset1.product(subset2, subset3) do |data|
  p data
end

これは、トリプルループと同じ効果があります。

于 2012-06-07T13:57:13.737 に答える
1

あなたのユーザーが

#name, gender, city, profession
Alice, female, Los Angeles, doctor
Bob, male, Los Angeles, lawyer
Carol, female, New York, astronaut
David, male, New York, programmer

すべてのユーザー、都市のすべてのユーザー、性別のすべてのユーザーをループするのではなく、ネストされたクエリを分割します。

#bad
User.each do |u1|
  u1.cities.each do |u2|
    u2.genders.each do |u3|
      u3.professions.each do |u4|
        u4.some_method
      end
    end
  end
end

#better
cities = ["Los Angeles", "New York"]
genders = ["female", "male"]
professions = ["lawyer", "doctor", "astronaut", "programmer"]
criteria = cities.product(genders, professions)

これで、これらすべての配列の外積を収集する 1 つの配列 (基準) を反復処理できます。

criteria.each do |cr|
  city, gender, profession = cr
  u = User.find_by_city_and_gender_and_profession(city, gender, profession)
  u.some_method
end
于 2012-06-07T19:41:42.287 に答える