2013-04-08 68 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