这是另一个问题的延续,但由于它有所不同,我最好将其重新发布为一个新问题:
旧问题
我正在从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,起初看起来很有希望,但可能不是我需要的......)
结束旧问题
这是另一个问题的答案: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})
在方法中,但是我收到了这个错误:
调用id为nil,错误地为4 - 如果你真的想要id为nil,请使用object_id
我想我可以把它作为一个论点来传递...... 但是我不是已经在下一行中将用户作为@user用户了吗?
@users = @user.users_sort_by_taken.paginate(page: params[:page])
为什么我不能从User.rb模型中的方法引用当前用户?
或者换句话说,我可以将current_user(或@user或用户)传递给SQL以从SQL结果中排除current_user吗?
任何帮助表示感谢。
答案 0 :(得分:8)
每个对象都有自己的一组实例变量 - 在一个对象中设置@user或@current_user对另一个对象没有任何意义。
方法的接收者(在这种情况下是您的用户)始终以self身份提供,因此self.id
可以获取用户的ID
自我实际上是隐含的 - 大部分时间你都不需要它而只是写id
会导致相同的事情(只要你在该用户的实例方法中)
答案 1 :(得分:6)
要在模型中引用@user
&#39; id
,您只需使用:
self.id