Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails如何在模型中引用当前对象_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Ruby on rails rails如何在模型中引用当前对象

Ruby on rails rails如何在模型中引用当前对象,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,这是另一个问题的继续,但由于它不同,我认为我最好将其作为一个新问题重新发布: 老问题 我在Hartl教程中将测验功能添加到twitter应用程序中,并拥有以下模型: 用户与教程基本相同: class User < ActiveRecord::Base has_many :followed_users, through: :relationships, source: :followed has_many :takens, dependent: :destroy has_m

这是另一个问题的继续,但由于它不同,我认为我最好将其作为一个新问题重新发布:

老问题


我在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
然后我可以做一些类似的事情:

User.find_by_id(1).followers.first.question_ids.count
在控制台中获取单个跟随器的计数

我感觉我就快到了

我如何对关注者进行排序,并跟踪用户的“takens”计数?(我也在看cache_count,一开始看起来很有希望,但可能不是我需要的…)


结束老问题

这是另一个问题的答案:

我在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)。我需要一种从用户排序中删除当前用户的方法

我想这可能有用:

WHERE (#{@current_user.id})
在方法中,但我得到以下错误:

为nil调用id,它会错误地为4——如果您确实想要nil的id,请使用object_id

我想我可以把它当作一个论据。。。 但是我不是已经在下面的一行中将用户设置为@user了吗

@users = @user.users_sort_by_taken.paginate(page: params[:page])
为什么我不能从user.rb模型中的方法引用当前用户

或者,我可以通过另一种方式将当前_用户(或@user或user)传递给SQL以从SQL结果中排除当前_用户吗


感谢您的帮助。

要在模型中引用
@user
id
,您只需使用:

self.id

每个对象都有自己的实例变量集-在一个对象中设置@user或@current_user对另一个对象来说并不意味着什么

方法的接收者(在本例中是您的用户)始终作为self可用,因此
self.id
获取用户的id


自我实际上是隐式的——大多数时候你不需要它,仅仅写
id
也会产生同样的结果(只要你是该用户的实例方法)

我是不是唯一一个盲人,看不到他在hartl教程的
用户列表中使用当前用户的位置,我认为当前用户可以在/helpers/sessions\u helper.rb中找到。但我也尝试了@user和this\u user=[各种组合的
@user,current\u user,@current\u user]
。。。当然都错了
self
与Java中的
this
非常相似,那么?是的,self与其他语言中的
this
非常相似谢谢。WHERE users.id!=(#{self.id})有效。我在某个地方读到self是用于类方法的——我想这取决于你把它放在哪里了!不客气。您甚至可以省略
self.
而只使用
id
,但为了清楚起见,您可能还是希望使用
self
。如果在方法的定义中使用
self
,它将成为类方法。但是在一个实例中,method
self
引用当前实例。
WHERE (#{@current_user.id})
@users = @user.users_sort_by_taken.paginate(page: params[:page])
self.id