2013-01-21 161 views
1

我得到這個錯誤。當我嘗試使用範圍時,爲什麼會出現此錯誤?

未定義的方法 '最近' 爲#

我的代碼是

用戶控制器

@users = User.find_by_username(params[:id]).all_following.recent 

用戶模型

scope :recent, lambda { |n = 10| order("last_active_at DESC").limit(n) } 
+0

請顯示定義'all_following'的代碼 –

+0

@MichaelDurrant謝謝。其實我正在使用這個gem'acts_as_follower' https://github.com/tcocca/acts_as_follower。 – Foo

+0

@MichaelDurrant有什麼想法? – Foo

回答

1

從寶石文檔all_following是一個數組。這個數組甚至可能是非同類的。

recent作用域實際上是一種可以在ActiveRecord上調用的方法。

恐怕兩者不匹配,這就是爲什麼錯誤說你不能在一個Array的實例調用recent

我希望有幫助。

+0

感謝您的解釋! – Foo

1

我不認爲這是可能的使用範圍,因爲all_following方法將返回一個數組,因此它甚至不會在用戶模型中查找範圍。你不應該使用作用域的另一個原因是該作用域是用於以特定的方式從數據庫中獲取項目,而不是對其進行排序。爲了得到你想要的功能,我想一個方法添加到Array類是這樣的:

class Array 
    def recent(limit = 10) 
    self.sort_by { |users| users[:last_active_at] }[0..(limit-1)] 
    end 
end 

然後就可以調用@users = User.find_by_username(params[:id]).all_following.recent(3)在你的控制器,並傳入要用於限值的任意值。如果您忽略限制值,例如@users = User.find_by_username(params[:id]).all_following.recent,那麼它將使用10作爲默認值。

+0

感謝您的美麗回答。我應該將這5行添加到models/user.rb嗎? – Foo

+0

我會將這些行添加到lib目錄中的單獨文件中,以保持它與模型分離,因爲這改變了數組類而不是用戶模型。確保如果你把它放在lib目錄下,它通過在你的config/application.rb文件中有'config.autoload_paths + =%W(#{config.root}/lib)'行來自動加載它。 (如果它不在那裏)你可以將它放在lib目錄中的任何文件中,它應該可以工作! – jvperrin

相關問題