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