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

时间:2010-07-29 11:05:36

标签: ruby-on-rails ruby functional-programming function

我有一个有很多属性的工作模型。我想使用图形来显示其中一些属性的总和。为此,我在视图的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 %>

创建其他图形,但这根本不是DRY,我想要一个函数,我可以将atribute作为参数传递。但我不知道该怎么做。

例如:

function(cpu) 

将返回

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

function(walltime) 

将返回

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

3 个答案:

答案 0 :(得分:3)

你可以做一些更简单的事情

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

然后迭代工作

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

另一种解决方案是在Job模型中创建一个方法 类似的东西:

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 %>

答案 1 :(得分:1)

<% 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) %>

答案 2 :(得分:1)

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

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