我在rails应用程序的ruby中有这个类
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"
还好吗?欢迎提出其他重构建议
答案 0 :(得分:2)
你为什么要通过课程?你没有在任何地方使用它。传递一个符号。
ChartData.logs_by_day(logs, :project)
然后
def self.logs_by_day(logs, prop)
# ...
log.send(prop).name
# ...
end
答案 1 :(得分:0)
对于Rails,您可能需要的是类似klass.name.underscore
的内容。这个及其对应的camelize
旨在在方法式命名约定和模块式命名约定之间进行转换。特别是,这将适用于像“UserData”这样的类名,它应该是“user_data”,而不是你只是从羽绒中获得的“userdata”。然后,您可以将其作为方法选择器传递给send
。