【问题标题】:Ruby shuffle! each array inside array红宝石洗牌!数组中的每个数组
【发布时间】:2014-03-07 00:55:40
【问题描述】:

我正在尝试做一个测验,所以我有很多问题和很多答案。我可以随机排列问题,因此它们不会每次都以相同的顺序出现。

q = Question.all().shuffle!

然后,我尝试随机排列每个问题的所有答案:

q.each{ |i| i.answers.shuffle! }

但是当我在视图上迭代 q 时,我总是每次都以相同的顺序得到每个问题的答案。关于我做错了什么的任何提示?

编辑

如果我这样做@question = Question.find(1,2,3).shuffle!,我会得到:

 [ #<Question id: 1, contenido: "lorem ipsum 1", created_at: "2014-02-09 13:13:56", updated_at: "2014-02-09 13:13:56">
#<Question id: 3, contenido: "lorem ipsum 3", created_at: "2014-02-09 13:13:56", updated_at: "2014-02-09 13:13:56">, 
#<Question id: 2, contenido: "lorem ipsum2", created_at: "2014-02-09 13:13:56", updated_at: "2014-02-09 13:13:56"> ]

如果我这样做 @question.first().answers 我会得到一个这样的数组:

#<ActiveRecord::Associations::CollectionProxy [
#<Answer id: 1, contenido: "Black", correcta: true, created_at: "2014-02-09 13:13:56", updated_at: "2014-0213:13:56", question_id: 1>, 
#<Answer id: 2, contenido: "Blue", correcta: false, created_at: "2014-02-09 13:13:56", updated_at: "2014-02-09 13:13:56", question_id: 1>, 
#<Answer id: 3, contenido: "Yellow", correcta: false, created_at: "2014-02-09 13:13:56", updated_at: "2014-02-09 13:13:56", question_id: 1>]>

我的控制器方法如下所示:

def quiz
    @questions = Question.find(1,2).shuffle!
    @questions.each{ |i| i.answers.shuffle! }
end

在视图中我这样做:

<% @questions.each_with_index do |pregunta, index| %>
    <div class="question-item <% if index == 0 %>current<% end %>">
    <p><%= index + 1  %>- <%= pregunta.contenido %></p>
    <%= hidden_field_tag "form[][pregunta]", pregunta.id  %>
    <%= hidden_field_tag "form[][respuesta]", "" %>
    <ul>
        <% pregunta.answers.each do |respuesta| %>
            <li><span class="radio" data-id="<%= respuesta.id %>"></span><span><%= respuesta.contenido %></span></li>   
        <% end %>
    </ul>   
    </div>
 <% end %>  

【问题讨论】:

  • 疯了!它不应该这样发生。 :)
  • 你能发布一组问题和答案的样本吗?
  • 如何在视图上打印?我也想看看 answers 方法,你是怎么定义的?
  • 可能是i.answers 给了你数组对象,它是原始对象的#dup,因此你在副本上进行洗牌,而不是实际的,因此您没有看到任何变化。尽管这都是可能的原因,但我不知道您的代码实际上有什么。这是一个相同的例子 - &gt;&gt; a = [[1,2,3],[3,6,4]] =&gt; [[1, 2, 3], [3, 6, 4]] &gt;&gt; a.each { |e| e.dup.shuffle! } =&gt; [[1, 2, 3], [3, 6, 4]] &gt;&gt; a.each { |e| e.dup.shuffle! } =&gt; [[1, 2, 3], [3, 6, 4]].
  • 看到那里虽然我调用了shuffle!,但原始a 条目没有任何变化,就像我一直对@987654335 条目的dup 对象所做的那样@.

标签: ruby-on-rails ruby arrays


【解决方案1】:

我可能会在访问它们时这样做,所以在视图中...

<% @questions.shuffle!.each_with_index do |pregunta, index| %>
    <div class="question-item <% if index == 0 %>current<% end %>">
        <p><%= index + 1  %>- <%= pregunta.contenido %></p>
        <%= hidden_field_tag "form[][pregunta]", pregunta.id  %>
        <%= hidden_field_tag "form[][respuesta]", "" %>
        <ul>
            <% pregunta.answers.shuffle!.each do |respuesta| %>
                <li><span class="radio" data-id="<%= respuesta.id %>"></span><span><%= respuesta.contenido %></span></li>   
            <% end %>
        </ul>   
    </div>
 <% end %>

【讨论】:

  • 这就是为什么我最终要让它发挥作用。我仍然想了解在迭代数组时如何修改数组。
  • 你应该能够做到@questions = @questions.each{ |i| i.answers.shuffle! } 洗牌!返回新数组,不修改您正在访问的数组。所以你需要分配结果(或使用不带'!'符号的随机播放
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2023-03-19
  • 2023-04-10
  • 2011-04-26
相关资源
最近更新 更多