代码之家  ›  专栏  ›  技术社区  ›  jalagrange

Ruby向同一个函数传递不同的属性参数

  •  2
  • jalagrange  · 技术社区  · 16 年前

    我有一个有很多特点的工作模式。我想使用图形来显示这些属性的总和。为此,我在生成图形的视图的javascript部分使用以下代码:

    <% for job in @daily_jobs %>
              ['<%= job.day %>',<%= job.walltime %>],
    <% end %>
    

    这将返回:

    ['2010-07-25', 1234],
    ['2010-07-26', 3456],
    ['2010-07-27', 1234],
    

    它工作得很好。但是,我不仅要创建属性“walltime”的图形,而且要为许多其他属性(内存、CPU等)创建图形,因此我必须创建以下函数:

    <% for job in @daily_jobs %>
                  ['<%= job.day %>',<%= job.cpu %>],
    <% end %>
    

    <% for job in @daily_jobs %>
                  ['<%= job.day %>',<%= job.memory %>],
    <% end %>
    

    要创建其他图形,但这一点也不枯燥,我想要一个单独的函数,在这个函数中我可以将atribute作为参数传递。但我不知道怎么做。

    例如:

    function(cpu) 
    

    会回来

    ['<%= job.day %>',<%= job.cpu %>],
    

    function(walltime) 
    

    会回来

    ['<%= job.day %>',<%= job.walltime %>],
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Draiken    16 年前

    你可以做些简单的事

    attr_list = [:cpu, :walltime, :memory]
    

    然后遍历作业

    <% for job in @daily_jobs %>
        <% attr_list.each do |attr| %>
          ['<%= job.day %>',<%= job.send(attr) %>],
        <% end %>
    <% end %>
    

    另一个解决方案是在作业模型中生成一个方法 类似:

    def as_js_attr(attr)
      "['#{self.day}', #{self.send(attr)}],"
    end
    

    上一个循环的增量为

    <% for job in @daily_jobs %>
       <% attr_list.each do |attr| %>
         <%= job.as_js_attr(attr) %>
       <% end %>
    <% end %>
    
        2
  •  1
  •   fantactuka    16 年前
    <% for job in @daily_jobs %>
        ['<%= job.day %>',<%= job.attr(:cpu) %>],
    <% end %>
    
    class Job
      def attr attribute
        attribute = self.send(attribute)
        .. do your staff ..
      end
    end
    

    UPD

    class Job
      def self.attributes_List jobs, attribute
        items = jobs.inject("") do |result, job|
          result + "['#{job.day}', #{job.send(attribute)}]" 
        end
        "[#{items.join(',')}]"
      end
    end
    
    <%= Job.attributes_List(@daily_jobs, :cpu) %>
    
        3
  •  1
  •   BitOfUniverse    16 年前

    您可以向作业类添加多个方法来执行此操作:

    class Job
    
      # returns "[['2010.07.25', 145], ['2010.07.26', 143]]"
      def self.graph_data jobs, attr
        data = jobs.collect {|j| j.graph_item_for attr}.join(', ')
        "[#{data}]"
      end
    
      # returns ['2010.07.25', 14]
      def graph_item_for attr
        "['#{self.day}', #{self.send(attr)}]"
      end
    
    end
    

    打电话之后:

    cpu_graph_data = Job.graph_data @daily_jobs, :cpu
    
    推荐文章