2013-08-20 43 views
0

假設我有兩個模型:User和Point。Rails模型中的自引用

Point belongs_to用戶。點有'金額'。我想在Point模型中定義一個返回用戶總分的方法。我想這樣調用它:user.points.total

我只是不知道如何在Point模型中定義方法,以便我不必將它傳遞給用戶的ID。我可以想象有一個簡單的方法可以做到這一點,但我的Googlefu正在讓我失望。

回答

3

假設用戶模型

has_many :points 

,你可以做這樣的假設要在Point模型中定義的方法,用戶模型

def total_points 
    points.sum(:amount) 
end 
+0

那是我的第一本能,但我寧願引用它像'User.points.total'而不是'User.total'。雖然謝謝! – opticon

+0

@TheSciz我看到'user.total_points'沒有錯,但你可以用[Association Extension](http://guides.rubyonrails.org/association_basics.html#association-extensions) – rubish

0

,你想使用:

class Point 
    def total 
    user.points.sum(:amount) 
    end 
end 

然後,您可以獲得與ag關聯的用戶的總積分iven point,通過調用point.total。您無法通過User.points.total獲得總積分,因爲User是一個班級,並且不涉及特定用戶。

+0

來完成你想要的。謝謝@Peter。使用這種方法,我收到以下錯誤,試圖使用whateveruser.points.total調用它:'[:ActiveRecord :: Relation']未定義的方法'total'。任何想法爲什麼會這樣? – opticon

+0

你能分享導致錯誤的代碼嗎? –

+0

對不起,我沒有仔細閱讀你的評論。既然你在'Point'中要求一個方法,你需要通過'Point'的一個實例來調用它。 –

0

考慮使用#sum,它使用SQL sum進行聚合。

例如,

person.points.sum('amount') 

# inside User.rb 
def total 
    points.sum('amount') 
end