【发布时间】:2013-04-08 16:29:28
【问题描述】:
这是另一个问题的延续,但由于它不同,我最好将它作为一个新问题重新发布:
老问题
我正在向 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
我希望能够按照所进行的测试次数的顺序显示followed_users 和followers。在控制台中可以通过:
User.find_by_id(1).question_ids.count
然后我可以这样做:
User.find_by_id(1).followers.first.question_ids.count
在控制台中获取单个关注者的计数。
我觉得我快到了。
如何通过关注者和关注用户的“获取”计数对关注者和关注用户进行排序? (我也在查看 cache_count,起初看起来很有希望,但可能不是我需要的......)
结束老问题
这是另一个问题的答案:rails order through count on other table
我在 User.rb 中采用了这样的方法:
def users_sort_by_taken
User.find_by_sql("SELECT users.*
SELECT users.*
FROM users INNER JOIN takens
ON users.id = takens.user_id
GROUP BY users.id
ORDER BY count(takens.user_id) DESC")
end
在 users_controller.rb 中调用如下:
def following
require 'will_paginate/array'
@title = "Following"
@user = User.find(params[:id])
#@users = @user.followed_users.paginate(page: params[:page])
@users = @user.users_sort_by_taken.paginate(page: params[:page])
render 'show_follow'
end
(供参考,注释掉的行来自 Hartl 教程) 一切都很好,但现在当前用户包含在以下列表中(因为上面的 SQL)。我需要一种方法从 users_sort_by_taken 中消除当前用户。
我认为这可能有效:
WHERE (#{@current_user.id})
在方法中,但我得到这个错误:
为 nil 调用 id,它会错误地为 4 -- 如果你真的想要 nil 的 id,请使用 object_id
我想我可以将它作为参数传递... 但我不是已经在下面的行中将用户作为@user 了吗?
@users = @user.users_sort_by_taken.paginate(page: params[:page])
为什么我不能从 User.rb 模型中的方法引用当前用户?
或者另一种方式,我可以将 current_user(或@user 或 user)传递给 SQL 以从 SQL 结果中排除 current_user 吗?
任何帮助表示赞赏。
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord