在ruby,rails上基于数组键类型生成新数组

时间:2016-03-29 05:19:59

标签: ruby-on-rails arrays ruby

我将问题类型设置为["A", "B", "C", "D", "E", "F"],现在我需要按照定义的顺序生成游戏特定的问题集(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

1 个答案:

答案 0 :(得分: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

以上可能被称为

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

要仅包含F一次,可能应该过滤输入只有一个F,如果出于某种奇怪的原因,这个检查应该在里面循环完成,一个人可以这样做:

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