2012-01-03 13 views
0

私はrailsメソッドを使って、投票(acts_as_votable)に基づいてブログをソートします。レールの名前付きスコープでコードの行数を減らす

方法は、ラインのこれらの多くの数を減らすために、いくつかnamedscopeにこれを変更する方法

 # @allblogs will be some filtered blogs array 
     @fetch = [] 
     @most_effective_votes = [] 
     for blog in @allblogs 
     @most_effective_votes << [blog.id,blog.votes_for] 
     end 
     @most_effective_votes = @most_effective_votes.sort{|a,b| a[1]<=> b[1]}.Reverse 
     for mev in @most_effective_votes 
     @fetch << blog.Find(mev[0]) 
     end 
     @allblogs = @fetch.Paginate(:per_page => 10,:page=>params[:page]) 

です。 いくつか提案してください。

答えて

0

私はあなたがしようとしていることは、配列の操作を必要とせずにクエリで行うことができると考えています。

まず、@allblogsはフィルタリングされた配列ではなくスコープでなければなりません。

第二には、それはあなたが使用して何をしていたのすべてを変更することができsames:

Blog.order("DESC votes_for") 

だからあなたnamed_scopeは次のようになります。

class Blog < ActiveRecord::Base 
    scope :with_most_votes, order("votes_for DESC") 
end 

そして@Fetchはallblogs.with_most_votes @だろう。

さらなるヘルプが必要な場合はお知らせください。

+0

いいえ、Blog.allではなく、allblogsのみを使用する必要があります。すべてのブログは他の関数からの戻り値です。私は引数エラーをスローしていないスコープで試しました。私はallblogs.findで試してみました(:all、:include => ["votes"]、conditions => ["votes.voteable_type = 'ブログ'、votes.voteable_id = blogs.idとvote =? :group => ["votes.voteable_id"]、:order => ["count(votes.id)desc"])。サーバー側で引数のエラーが発生しました。なぜそうなのか ? – useranon

+0

配列にスコープを適用することはできません。あなたは、すべてのブログを返す機能を私に見せてもらえますか? – e3matheus

関連する問題