【问题标题】:rails how to reference current object in Modelrails如何在模型中引用当前对象
【发布时间】: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


    【解决方案1】:

    每个对象都有自己的一组实例变量——@user 或 @current_user 设置在一个对象中这一事实对另一个对象没有任何意义。

    方法的接收者(在这种情况下是您的用户)始终可以作为自己使用,因此self.id 会为您获取用户的 id

    self 实际上是隐含的 - 大多数时候你不需要它,而只写 id 会导致相同的结果(只要你在该用户的实例方法中)

    【讨论】:

    • 我是唯一一个失明且看不到自己在哪里使用users_sory_by_taken 中的current_user 的人吗?
    • 对于 hartl 教程,我认为 current_user 在 /helpers/sessions_helper.rb 中可用。但我也尝试过@user 和 this_user = [@user, current_user, @current_user] 的各种组合...当然全错了! self 与 Java 中的 this 几乎相同,那么?
    • Yes self is like this in other languages
    【解决方案2】:

    要在模型中引用@userid,可以简单地使用:

    self.id
    

    【讨论】:

    • 谢谢。 WHERE users.id != (#{self.id}) 有效。我在某处读到 self 用于 Class 方法 - 我想这取决于你把它放在哪里!
    • 不客气。你甚至可以省略self.,只使用id,但为了清楚起见,你可能还是想使用self。如果在方法的定义中使用self,它就变成了类方法。但在实例方法内部self 指的是当前实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2011-04-21
    • 2015-10-08
    • 2013-06-20
    相关资源
    最近更新 更多