2011-07-20 60 views
0

我試圖返回給定用戶(current_user)通過一週(最近7天)創建的活動,並按每天花費的時間總和進行分組。Ruby和MySQL Db查詢組限制

CURRENT_USER的has_many項目 currents_user的has_many活動,通過:項目

對於每一個過去的7天,我想總結一下花在活動(每個活動都有時間字段存儲所花費的時間)時間,其中項目是內部( project.internal是布爾型)

換句話說,這就是我所需要的。今天是星期三。

今天:

  • 總活動時間進行內部項目
  • 總活動時間不是內部項目

昨天...

2.days.ago ...在過去7天后依次類推

模型中有什麼,控制r和意見?

理想情況下,它需要使用MySQL和SQLite。先謝謝你。

回答

0

這樣的方法在您的模型中最好定義並在您的視圖中執行。控制器只能真正起作用,以便視圖可以完成工作。

在模型中定義這些元素的好處是可以爲它們編寫單元測試,通常比功能或集成測試更易於設置。您的方法也很容易從console命令行進行測試。

對於很多事情你可以簡單地運用sum方法對你的關係。它可能是這個樣子:

user.activities.sum(:time_spent) 

你可以申請範圍的activities關係,以更好地定位結果。

更新

結成團隊,以不同的參數,你總是可以表達這種SQL連接並提取計算值。查詢會是這個樣子:

SELECT users.id, projects.internal, SUM(activities.time) AS total_time, activities.on_date 
    FROM users 
    LEFT JOIN projects ON projects.user_id=users.id 
    LEFT JOIN activities ON activities.project_id=projects.id 
    GROUP BY users.id, projects.internal, activities.on_date 

一旦你得到了正確設置,調整列名的要求,你可以用它的話,可以很容易地提取值:

class User < ActiveRecord::Base 
    def self.time_spent_on_projects(user_id = nil) 
    query = "..." # Query from above 

    # Allow scoping to a particular user by adding a WHERE clause 
    query = self.sanitize_sql([ "#{query} WHERE users.id=?", user_id ]) 

    self.connection.select_all(query) 
    end 

    def time_spent_on_projects 
    self.class.time_spent_on_projects(self.id) 
    end 
end 

這將返回所有值爲Stringnil,因此您可能需要根據需要轉換爲數字。

+0

謝謝。我設法得到current_user.activities.sum(:time),但是當我需要使用projects表作用域並返回一個值數組(每天一個值)時,會遇到困難。 – Gaelle

+0

您只需要'GROUP BY'日,雖然不支持輔助方法,但您始終可以使用User.connection.select_all從查詢中提取該信息。 [select_all](http://apidock.com/rails/ActiveRecord/ConnectionAdapters/DatabaseStatements/select_all)的參考將有助於解釋。我在示例中添加了一些說明。 – tadman