如何在Rails中返回所有元素数组?

时间:2013-07-30 12:57:27

标签: ruby-on-rails ruby arrays ruby-on-rails-4

我有一个控制器:

def grafico_gantt 
    @mapa = Hash.new
    @mapa[:tasks] = []
    @projeto.atividades.each do |a|
        @mapa[:tasks] << {
           id:a.id,
           descricao:a.descricao,
           status:a.status,
           data_inicial:a.data_inicial.to_datetime.to_i*1000,
           tempo_gasto:a.tempo_gasto.to_i,
           data_final:a.data_final.to_datetime.to_i*1000
        }
    end
end

和.js.erb

<script>
    $(function() {
        "use strict";
        $(".gantt").gantt({
            source: [{
                name: '<%= raw @mapa[:tasks][0][:descricao] %>',
                desc: '<%= raw @mapa[:tasks][0][:status] %>'+"% concluído",
                values: [{
                    from: "/Date(<%= raw @mapa[:tasks][0][:data_inicial] %>)/",
                    to: "/Date(<%= raw @mapa[:tasks][0][:data_final] %>)/",
                    label:"<%= raw @mapa[:tasks][0][:descricao] %>", 
                    customClass: "ganttRed"
                }]
            }],
        scale: "days",
        minScale: "days",
        maxScale:"months",
        navigate: "scroll",
        waitText: "Aguarde...",
    });
</script>

我在数组中有3个值,但是,怎么看,我只需要1,@ mapa [:tasks] [0] [:descricao] 如何才能取得所有价值?因为@mapa [:tasks] [:descricao]不起作用:/

谢谢!

2 个答案:

答案 0 :(得分:2)

首先,我会更像这个(未经测试的)代码编写控制器:

def grafico_gantt 
  @mapa = {}
  @mapa[:tasks] = @projeto.atividades.map { |a|
    {
      id: a.id,
      descricao: a.descricao,
      status: a.status,
      data_inicial: a.data_inicial.to_datetime.to_i * 1000,
      tempo_gasto: a.tempo_gasto.to_i,
      data_final: a.data_final.to_datetime.to_i * 1000
    }
  }
end

要访问返回数组的所有descricao元素,请使用mapcollect将数组转换为您想要的部分:

@mapa[:tasks].collect { |e| e[:descricao] }

mapcollect是同义词。虽然它们是别名的,但有时使用collect在句法上更有意义,有时map更有意义。

在重写上面的代码时,为什么要创建哈希散列有点令人困惑。哈希的单个元素哈希有点......令人困惑......不优雅,但也许你没有向我们展示一切。

如果哈希没有添加任何其他内容,我建议将其简化为:

def grafico_gantt 
  @mapa = @projeto.atividades.map { |a|
    {
      id: a.id,
      descricao: a.descricao,
      status: a.status,
      data_inicial: a.data_inicial.to_datetime.to_i * 1000,
      tempo_gasto: a.tempo_gasto.to_i,
      data_final: a.data_final.to_datetime.to_i * 1000
    }
  }
end

通过删除找到[:tasks]元素的需要,它将返回一个哈希数组并简化对它的访问:

@mapa.collect { |e| e[:descricao] }

答案 1 :(得分:0)

这是怎么回事:

@mapa[:tasks].each{|e| puts e[:descricao] }

@mapa[:tasks].map{|e| e[:descricao] }