0

我在 ruby​​ on rails 应用程序中有这个类

class ChartData
  def self.user_logs_by_day(logs)
    days_with_hours = Hash.new{|h, k| h[k] = Hash.new(&h.default_proc)}
      logs.each do |log|
        days_with_hours[log.user.name][log.log_date] = log.total_hours
      end
    days_with_hours
  end

  def self.project_logs_by_day(logs)
    days_with_hours = Hash.new{|h, k| h[k] = Hash.new(&h.default_proc)}
      logs.each do |log|
        if !log.project.nil?
          days_with_hours[log.project.name][log.log_date] = log.total_hours
        else
          days_with_hours[@default][log.log_date] = log.total_hours
        end
      end
    days_with_hours
  end
end

我想像这样把这两种方法合二为一,因为我想在很多模型上都使用这种方法。

class ChartData
  def self.logs_by_day(logs, klass)
    days_with_hours = Hash.new{|h, k| h[k] = Hash.new(&h.default_proc)}
      logs.each do |log|
        if !log.klass.nil?
          days_with_hours[log.klass.name][log.log_date] = log.total_hours
        else
          days_with_hours[@default][log.log_date] = log.total_hours
        end
      end
    days_with_hours
  end
end

我想将类或模型传递给这样的方法

ChartData.logs_by_day(logs, Project)

如何处理模型中的参数 Project 使其成为日志上的实例方法?

相当笨拙的尝试

1.9.3p125 :026 > Project.name.downcase
 => "project" 

好点?欢迎其他重构建议

4

2 回答 2

2

你为什么想通过这门课?你没有在任何地方使用它。传递一个符号。

ChartData.logs_by_day(logs, :project)

进而

def self.logs_by_day(logs, prop)
  # ...
  log.send(prop).name
  # ...
end
于 2012-12-04T21:57:34.803 回答
0

For Rails, what you probably want is something like klass.name.underscore. This and its counterpart camelize are designed to convert between method-style naming conventions and module-style naming conventions. In particular, this will work with class names like "UserData", which should be "user_data" rather than the "userdata" you'd get from just downcasing. You can then pass it as the method selector to send.

于 2012-12-04T22:51:55.887 回答