これは 1 日 1 回の作業なので、編集、保守、視覚化が容易な方法でデータを保存すると思います。あなたの多対多のアプローチはうまくいくでしょう。主に、特定の ball_number を選択したユーザーを簡単に見つけられるようにしたいと考えています。
users
id
name
drawings
id
type # Mega Millions or Singapore (maybe subclass Drawing)
drawing_on
wining_picks
drawing_id
ball_number
ticket
drawing_id
user_id
correct_count
picks
id
ticket_id
ball_number
数字を取得したら、図面で特定の数字を選択するすべての user_id を見つけます
図面を日付で取得する
drawing = Drawing.find_by_drawing_on(drawing_date)
ball_number と描画でユーザーを取得します。
picked_1 = User.picked(1,drawing)
picked_2 = User.picked(2,drawing)
picked_3 = User.picked(3,drawing)
これはユーザーのスコープです
class User < ActiveRecord::Base
def self.picked(ball_number, drawing)
joins(:tickets => :picks).where(:picks => {:ball_number => ball_number}, :tickets => {:drawing_id => drawing.id})
end
end
次に、配列の交差をすばやく実行して、3、4、5、6 の選択が正しい user_ids を取得します。当選番号をループして順列を取得します。
たとえば、当選番号が 3,8,21,24,27,44 の場合
some_3_correct_winner_ids = picked_3 & picked_8 & picked_21 # Array intersection
勝者ごとに、正しいカウントでチケットを更新します。
勝者を個別に保存する可能性はありますが、correct_count にインデックスがあり、チケットのデータが多すぎないため、現時点ではおそらく問題ありません。