2016-03-29 17 views
0

レール、ルビーの配列のキータイプに基づいて新しい配列を生成し<code>["A", "B", "C", "D", "E", "F"]</code>として、今私は、定義された順序での質問のゲームの特定のセット(32の質問)を生成する必要があり、私は質問タイプとの質問に設定した

のようなゲーム1 ["A", "A", "C", "A", "D", "A", "C", "D", "A", "A", "E", "F", .. ]

のためにこれまでのところ私は

def self.generate_rps_question(game_id) 
    questions = [] 
    q1 = Question.where(game_id: game_id).where(qtype: "A").sample(1) 
    questions << q1 unless questions.include? (q1) 
    q2 = Question.where(game_id: game_id).where(qtype: "A").sample(1) 
    questions << q2 unless questions.include? (q2) 
    q3 = Question.where(game_id: game_id).where(qtype: "C").sample(1) 
    questions << q3 unless questions.include? (q3) 
    q4 = Question.where(game_id: game_id).where(qtype: "A").sample(1) 
    questions << q4 unless questions.include? (q4) 
    q5 = Question.where(game_id: game_id).where(qtype: "D").sample(1) 
    questions << q5 unless questions.include? (q5) 
    . 
    . 
    . 
    . 
    questions 
end 

これを行うには良い(短い)方法はありますが、次の行っていますか?

更新

def self.generate_rps_question(game_id, types) 
    types.inject([]) do |memo, type| 
     unless type == "F" 
     while memo.include?(
      q = Question.where(game_id: game_id, qtype: type).sample) do end # skip unless unique 
     else 
     q = Question.where(game_id: game_id, qtype: type).sample 
     end 
     memo << q 
    end 

    end 
+0

は、質問タイプの事前に定義された順序からの質問を選択しますか、またはあなたがNEありません質問タイプの順番をランダム化することもできますか? –

+0

@RohitJangid質問タイプの順序があらかじめ定義されています。 –

答えて

2

あなたのアプローチは非常に正しいではありません:あなたはすでに質問を追加して遭遇するかどうかを、それぞれの位置は、再試行のではなく、スキップされます。

def self.generate_rps_question(game_id, types) 
    types.inject([]) do |memo, type| 
    while memo.include?(
     q = Question.where(game_id: game_id, qtype: type) 
        .sample) do end # skip unless unique 
    memo << q 
    end 
end 

上記のいくつかの奇妙な理由で、このチェックは、内部を行わなければならない場合には、一つだけFを持つように一度だけ、1はおそらく入力をフィルタする必要がありFを含めるには

self.generate_rps_question(1, %w[A A C F A D E...]) 

と呼ばれるかもしれませんループ、1が行うことができます:

def self.generate_rps_question(game_id, types) 
    types.inject([]) do |memo, type| 
    next memo if memo.include?('F') && type == 'F' # skip superfluous Fs 
    while memo.include?(
     q = Question.where(game_id: game_id, qtype: type) 
        .sample) do end # skip unless unique 
    memo << q 
    end 
end 
+0

'types.inject([])do | memoで' types.lengthx.inject([])do | memo、i | 'を置き換えて、 'types'配列に対するインデックスアクセスを避けることができます。 – sschmeck

+0

@sschmeck本当にありがとう、更新されました。 – mudasobwa

+0

ありがとう! @ mudasobwaしかし、私はタイプ "F"の質問が一意である必要はないのですか? 'types.inject([])do |メモ、タイプ| メモ:q = Question.where(game_id:qtype:type).sample)do end#ユニークでない限りスキップする else q = Question.where(game_id: game_id、qtype:type).sample end メモ<< q end' これもリファクタリングできますか? –