我正在从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,起初看起来很有希望,但可能不是我需要的......)
答案 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出现了一些语法错误,但它们已被修复。请注意,我假设您的表名为users
和questions
。它们可能会有所不同。