這樣的方法在您的模型中最好定義並在您的視圖中執行。控制器只能真正起作用,以便視圖可以完成工作。
在模型中定義這些元素的好處是可以爲它們編寫單元測試,通常比功能或集成測試更易於設置。您的方法也很容易從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
這將返回所有值爲String
或nil
,因此您可能需要根據需要轉換爲數字。
謝謝。我設法得到current_user.activities.sum(:time),但是當我需要使用projects表作用域並返回一個值數組(每天一個值)時,會遇到困難。 – Gaelle
您只需要'GROUP BY'日,雖然不支持輔助方法,但您始終可以使用User.connection.select_all從查詢中提取該信息。 [select_all](http://apidock.com/rails/ActiveRecord/ConnectionAdapters/DatabaseStatements/select_all)的參考將有助於解釋。我在示例中添加了一些說明。 – tadman