2013-04-18 20 views
0

社區的has_many:代碼
代碼 belongs_to的:社區如何計算帶有條件的對象?

用戶的has_many:代碼
代碼 belongs_to的:用戶

@community.codes.users.count 

這將返回其代碼是用戶數量屬於社區。

代碼有一個名爲visible布爾

如果我只是想指望其visible代碼真正的用戶數量,也就是屬於社會的列?

有沒有可能數一數?

我的意思是,我想獲得計算的數字,就像下面這樣計算。
我想在一行中。

@community.codes.each do |code| 
    if code.visible && code.user 
     count = count + 1 
    end 
end 
+0

請提供一個例子以清除您的問題 – eneskaya

+0

@eneskaya感謝您的評論。我描述了一個例子:) – cat

+0

好吧,讓我們考慮這種方式。 @社區就像加州,紐約等州一樣......代碼代表那些州的機票。用戶已經購買了許多美國各州的門票,並且他們購買門票的數量取決於每個用戶。在這裏,我想要統計已購買加利福尼亞州門票(@community)的用戶數量,並將門票保存爲對其他用戶不可見。這有意義嗎? – cat

回答

2

這一行相當於你所需要的。它會給出確切的結果。

User.joins(:codes => :community).where("codes.visible=? AND communities.id=?", true, @community.id).count 

還有另一個更好的方法。您應該使用namedscope這種類型的查詢,這樣就可以在你需要多次使用它:

在用戶模式:

scope :visible_in_community, (lambda do |community_id| 
    joins(:codes => :community).where("codes.visible=? AND communities.id=?", true, community_id) 
end) 

你可以叫任何地方

User.visible_in_community(@community.id) 
+0

你的一個是最好的,因爲在其他2個答案中,當用戶被刪除並且仍然有代碼時,它仍然是計數的。 ..但是用你的代碼,當用戶被刪除時,它不會再算他了。這就是我想要的。謝謝:) – cat

+0

還有一個問題PLZ !!!如果我有另一個名爲'Profile'的模型,並且它有一個名爲'notification'的布爾列。然後,用戶has_one:個人資料,個人資料belongs_to:用戶。我如何將這個條件添加到你的?我的意思是。它不應該在user.profile.notification爲false時計數。你能告訴我如何? – cat

+0

這不是更好的方法。它更快。更好的是創建'self.visible_in_community'方法。請參閱Rails指南[ActiveRecord查詢](http://guides.rubyonrails.org/active_record_querying.html#scopes)部分§13.2 – Hauleth

2

希望這會對你有用。

@community.codes.where('visible = ? AND user_id IS NOT NULL', true).count 
1

下面一行相當於最後一塊你的問題的代碼,但是更有效,因爲在一個單一的SQL請求:獲取計數可見CodeUser和屬於@community

Code.where('visible = ? AND community_id = ? AND user_id IS NOT NULL', true, @community.id).count