繁体   English   中英

ruby类作为方法中的参数

[英]ruby class as a parameter in a method

我在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" 

好点? 欢迎提出其他重构建议

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

ChartData.logs_by_day(logs, :project)

接着

def self.logs_by_day(logs, prop)
  # ...
  log.send(prop).name
  # ...
end

对于Rails,你可能想要的是像klass.name.underscore 这个及其对应的camelize旨在在方法式命名约定和模块式命名约定之间进行转换。 特别是,这将适用于像“UserData”这样的类名,它应该是“user_data”,而不是你只是从羽绒中获得的“userdata”。 然后,您可以将其作为要send的方法选择器send

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM