rails通过其他表的计数顺序

时间:2013-04-08 02:56:26

标签: sql ruby-on-rails ruby ruby-on-rails-3 sorting

我正在从Hartl教程中向twitter应用添加测验功能,并拥有以下模型:

用户与教程几乎相同:

class User < ActiveRecord::Base

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

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

Taken是用户ID的问题ID表:

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

end

问题中没什么有趣的:

class Question < ActiveRecord::Base
  attr_accessible :category, :correct, :option1, :option2, :option3, :qn
end

我希望能够按照他们所进行的测试次数来显示follow_users和followers。在控制台中,这可以通过:

User.find_by_id(1).question_ids.count

然后我可以做类似的事情:

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

在控制台中获取单个关注者的计数。

我觉得我差不多了。

如何通过'takens'计数对关注者和follow_users进行排序? (我也在看cache_count,起初看起来很有希望,但可能不是我需要的......)

1 个答案:

答案 0 :(得分: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。它们可能会有所不同。