Ruby передает разные аргументы атрибутов одной и той же функции - PullRequest
2 голосов
/ 29 июля 2010

У меня есть модель работы, которая имеет много атрибутов.Я хотел бы использовать графику для отображения суммы некоторых из этих атрибутов.Для этого я использую следующий код в части представления javascript, которая создает график:

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

Это возвращает это:

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

Что работает нормально.Тем не менее, я хочу не только создавать графики атрибута «walltime», но и для многих других атрибутов: memory, cpu и т. Д. Так что мне придется создавать такие функции, как:

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

И

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

для создания других графиков, но это совсем не СУХОЙ, я хотел бы одну функцию, в которой я мог бы передать атрибут в качестве аргумента.Но я не знаю, как это сделать.

например:

function(cpu) 

вернется

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

и

function(walltime) 

вернется

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

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

вы могли бы сделать что-то попроще

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 %>
1 голос
/ 29 июля 2010

Вы можете добавить несколько методов в свой класс работы, чтобы сделать это:

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
1 голос
/ 29 июля 2010
<% 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) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...