2012-12-04 67 views
0

我有這個類在Ruby on 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) 

我如何處理模型參數的項目,所以它會是在日誌中的實例方法?

一個相當笨拙的嘗試

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

更好嗎?歡迎其他重構建議

+0

'Project.name.downcase' - 這樣你就會有一個字符串,而不是一個實例方法。 –

+0

我知道這就是爲什麼它是「一個相當笨拙的嘗試」; ) –

回答

2

爲什麼你想通過這門課?你沒有在任何地方使用它。傳遞一個符號。

ChartData.logs_by_day(logs, :project) 

然後

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

謝謝你的工作。然而,在我的下一個方法中,我正在使用這個類。你知道我怎麼可以用這個符號給這個'User.chart_lables(公司)'帶來優雅的東西嗎? –

+0

用這種方法提出另一個問題。因爲這是一種不同的情況 –

0

對於Rails開發,你可能想要的是像klass.name.underscore。這和它的對應camelize被設計用來在方法風格的命名約定和模塊風格的命名約定之間進行轉換。特別是,這將與像「UserData」這樣的類名稱一起使用,該類名稱應該是「user_data」,而不是僅從downcasing中獲得的「userdata」。然後您可以將其作爲方法選擇器傳遞給send