2013-04-08 27 views
3

這是另外一個問題的延續,但因爲它是不同的,不過,我覺得我有更好的重新發布它作爲一個新的問題:軌如何引用當前對象模型

老問題


我添加測驗功能從哈特爾教程Twitter的應用程序,並且有下列型號:

用戶幾乎是一樣的教程:

class User < ActiveRecord::Base 

    has_many :followed_users, through: :relationships, source: :followed 

    has_many :takens, dependent: :destroy 
    has_many :questions, through: :takens 
end 

兩者是問題的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和追隨者在數字的順序他們採取的測試。在控制檯這可以通過有:

User.find_by_id(1).question_ids.count 

然後,我可以這樣做:在控制檯

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

得到計數爲一個單一的跟隨者。

我覺得我快到了。

如何通過他們的「丹尼斯數」來分類追隨者和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 

它被調用在美國ers_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,這將被錯誤地4 - 如果你真的想要的ID無,使用object_id

我想我可以通過它作爲一個參數... 但是我不在下面一行中已經有用戶@user了嗎?

@users = @user.users_sort_by_taken.paginate(page: params[:page]) 

爲什麼我無法從User.rb模型中的方法引用當前用戶?

換句話說,我可以將current_user(或@user或user)傳遞給SQL以從SQL結果中排除current_user嗎?

任何幫助表示讚賞。

回答

6

每個對象都有它自己的一套實例變量的 - 事實上,@user或@current_user在一個對象來設置沒有什麼與另一個對象

的方法的接收器(在這種情況下,您的用戶)總是可以作爲自我,所以self.id讓你的用戶ID

自實際上是隱含的 - 大部分的時間你不會需要它,只要編寫id將導致相同的事情(只要你在該用戶的實例方法)

+0

我是唯一一個盲人,並且沒有看到他在'users_sory_by_taken'中使用'current_user'的位置?對於hartl教程, – Zippie 2013-04-08 07:51:03

+0

,我認爲current_user可以在/helpers/sessions_helper.rb中找到。但我也試過@user和this_user = [@user,current_user,@current_user的各種組合]'......當然都是錯的! 'self'與Java中的'this'幾乎相同,那麼呢? – grooble 2013-04-08 08:04:33

+0

是的,自己就像''這個'在其他語言 – 2013-04-08 08:07:02

5

要引用@user「在S型id,你可以簡單地使用:

self.id 
+1

謝謝。 WHERE users.id!=(#{self.id})起作用。我在某處看到自己是用於Class方法的地方 - 我想這取決於你把它放在哪裏! – grooble 2013-04-08 07:51:13

+2

不客氣。你甚至可以省略'self.',只使用'id',但爲了清晰起見,你可能想要使用'self'。如果在方法的定義中使用'self',它就成爲一個類方法。但是在一個實例方法中'self'指向當前實例。 – Mischa 2013-04-08 08:36:26

相關問題