【问题标题】:rails order through count on other tablerails order through count on other table
【发布时间】:2013-03-30 00:44:44
【问题描述】:

我正在向 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 和 follower。在控制台中可以通过:

User.find_by_id(1).question_ids.count

然后我可以这样做:

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

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

我觉得我快到了。

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

【问题讨论】:

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


    【解决方案1】:

    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。它们可能对您有所不同。

    【讨论】:

    • 谢谢,我试试看。我的表确实是这样命名的。这要去哪里?我可以以某种方式将其放入 User 模型中以使其成为默认排序吗?或者,我应该将上面的行放在控制器中给我一个用户数组吗?
    • 你也许可以在你的模型中定义一个方法,比如“sort_by_questions_taken”,它只调用那行代码,然后在你的控制器中你可以使用 User.sort_by_questions_taken
    • 您的 sql 不起作用,但您确实为我指明了正确的方向!玩弄 sqlite 让我得到了这个(如果有一天有人遇到类似问题): SELECT users.* FROM users INNER JOIN takes ON users.id = takes.user_id GROUP BY users.id ORDER BY count(takens .user_id) DESC
    • 为了将来参考,这是我使用的 sql:SELECT fo_ed.* FROM (SELECT users.* from users INNER JOIN relationships ON users.id = followed_id WHERE follower_id = (#{id})) fo_ed LEFT JOIN takens ON fo_ed.id = takens.user_id GROUP BY fo_ed.id ORDER BY count(takens.user_id) DESC。它提供关注(以及通过在内部 SELECT 中交换 follower_id 和 follow_id 的关注者),排除用户自己按测试次数的顺序返回它(哇!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2012-09-13
    • 2011-10-06
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多