Ruby on rails 基于ruby、rails上的数组键类型生成新数组

Ruby on rails 基于ruby、rails上的数组键类型生成新数组,ruby-on-rails,arrays,ruby,Ruby On Rails,Arrays,Ruby,我有一组问题,问题类型为[A,B,C,D,E,F],现在我需要生成一组游戏特定的问题,按照定义的顺序生成32个问题 就像游戏1[A,A,C,A,D,A,C,D,A,A,A,E,F,…] 到目前为止,我已经完成了以下工作 def self.generate_rps_question(game_id) questions = [] q1 = Question.where(game_id: game_id).where(qtype: "A").sample(1) questio

我有一组问题,问题类型为[A,B,C,D,E,F],现在我需要生成一组游戏特定的问题,按照定义的顺序生成32个问题

就像游戏1[A,A,C,A,D,A,C,D,A,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

您的方法不太正确:无论您是否遇到已添加的问题,都将跳过相应的位置,而不是重试

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,可能应该过滤输入,使其只有一个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

您的方法不太正确:无论您是否遇到已添加的问题,都将跳过相应的位置,而不是重试

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,可能应该过滤输入,使其只有一个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

是否要从预定义的问题类型顺序中选择问题,或者您还需要随机化问题类型的顺序?@RohitJangid问题类型的顺序是预定义的。是否要从预定义的问题类型顺序中选择问题,或者您还需要随机化问题类型的顺序?@RohitJangid问题类型的顺序是预定义的问题类型是预定义的。您可以替换类型。长度。时间。按类型注入[]do | memo,i |。注入[]do | memo,type |以避免对类型数组的索引访问。谢谢@mudasobwa但如果我不需要F型问题是唯一的呢?types.inject[]do | memo,type |除非type==F而memo.include?q=Question.wheregame\u id:game\u id,qtype:type.sample结束跳过,除非是唯一的q=Question.wheregame\u id:game\u id,qtype:type.sample结束备注您可以替换type.length.times.inject[]do | memo,i | by type.inject[]do | memo,type |以避免对类型数组的索引访问。谢谢@mudasobwa但如果我不需要F型问题是唯一的呢?types.inject[]do | memo,type |除非type==F而memo.include?q=QUOTE.wheregame\U id:game\U id,qtype:type.sample结束跳过,除非是唯一的q=QUOTE.wheregame\U id:game\U id,qtype:type.sample结束备忘录