2013-04-08 118 views
1

我加入測驗功能從哈特爾教程Twitter的應用程序,並且有下列型號:軌道通過數訂購其他表

用戶幾乎是一樣的教程:

class User < ActiveRecord::Base 

    has_many :followed_users, through: :relationships, source: :followed 

    has_many :takens, dependent: :destroy 
    has_many :questions, through: :takens 
end 

採取問題是IDS的將用戶ID表:

:在問

class Taken < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :question 

end 

什麼有趣

我希望能夠按已測試次數顯示followed_users和followers。在控制檯這可以通過有:

User.find_by_id(1).question_ids.count 

然後,我可以這樣做:在控制檯

User.find_by_id(1).followers.first.question_ids.count 

得到計數爲一個單一的跟隨者。

我覺得我快到了。

如何通過他們的「丹尼斯數」來分類追隨者和follow_users? (我也在看cache_count,它起初看起來很有前途,但可能不是我所需要的......)

回答

4

Ruby on Rails沒有提供面向對象的機制來執行此操作;你必須自己編寫SQL。在你的情況,我會說,以下行應該工作:

User.find_by_sql("SELECT users.*, COUNT(questions.id) 
AS c FROM users, questions WHERE questions.user_id = users.id 
GROUP BY users.id ORDER BY c DESC") 

我沒有在我面前的實際表,所以我不能肯定這是真實有效的SQL,但是希望它應該工作。

編輯:我的SQL有一些語法錯誤,但他們已經修復。請注意,我假設您的表格被稱爲usersquestions。他們可能會有所不同。

+0

謝謝,我會試試看。我的表格確實是這樣命名的。這個去哪了?我可以以某種方式將它放在用戶模型中,使其成爲默認排序?或者,我應該把上面的行放在控制器中給我一個用戶數組? – grooble 2013-04-08 03:54:14

+0

你也許可以在你的模型中定義一個方法,比如「sort_by_questions_taken」,它只是調用那行代碼,然後在你的控制器中你可以使用User.sort_by_questions_taken – hatkirby 2013-04-08 04:05:45

+1

你的sql不起作用,但你肯定指出了我正確的方向!在sqlite中玩弄了我的這一個(哪裏有一天有類似的問題):SELECT用戶。* FROM users INNER JOIN takens ON users.id = takens.user_id GROUP BY users.id ORDER BY count(takens.user_id)DESC – grooble 2013-04-08 04:52:49