ruby on rails - Using Active Record Reputation System gem, no sorting happens when I sort by votes -


following railscast reputation system gem, added following code microposts_controller

def index   @microposts = micropost.paginate(page: params[:page]).find_with_reputation(:votes, :all, order: "votes desc")   @micropost  = current_user.microposts.build end 

but no sorting happens in index action aside default scope set in model

in micropost model have

class micropost < activerecord::base     belongs_to :user     has_many :retweets     has_reputation :votes, source: :user, aggregated_by: :sum     default_scope -> { order('created_at desc') } 

if change default scope to

default_scope -> { order('votes desc') } 

it works how want index page breaks of other pages.

i tried removing default scope , leaving in find_with_reputation method still doesn't order votes.

i tried defining scope in method in micropost model this

  def self.popular     find_with_reputation(:votes, :all, {:order => 'votes desc'})   end 

and make code in microposts_controller this

  def index     @microposts = micropost.paginate(page: params[:page]).popular     @micropost  = current_user.microposts.build   end 

it still not sort votes.

here copy of log output visiting micropost index page https://gist.github.com/anonymous/9745552

here link gem https://github.com/narkoz/activerecord-reputation-system/tree/rails4

my routes.rb microposts looks this

  resources :microposts, only: [:create, :destroy, :index]     member { post :vote }     member { post :retweet}   end 

any guidance appreciated.

update

my home page feed designed differently i'm doing micropost index feed. maybe comparing works doesn't pinpoint issue.

i have static pages controller sets scope home action this

def home       @micropost  = current_user.microposts.build       @feed_items = current_user.feed.paginate(page: params[:page]) end 

in user model define feed method used in static pages controller so

def feed   micropost.from_users_followed_by_including_replies(self) end 

the from_users_followed_by_including_replies(self) method scope set in micropost model

scope :from_users_followed_by_including_replies, lambda { |user| followed_by_including_replies(user) }   def self.followed_by_including_replies(user)       followed_ids = %(select followed_id relationships                        follower_id = :user_id)       where("user_id in (#{followed_ids}) or user_id = :user_id or to_id = :user_id",             { :user_id => user })  end 

maybe need adapt similar approach index action microposts controller

edit

in getting hands on code, i've found real problem stems use of default_scope.

the original order() clause specified in default scope still being applied, when adding own order().

as side note, issue kind of fixed in rails 4.0, behavior reverted in 4.0.1.

the solution apply reorder()

# model def self.popular   reorder('votes desc').find_with_reputation(:votes, :all) end  # controller def index   @microposts = micropost.page(params[:page]).popular end 

original answer

it seems using paginate method directly may not work activerecord-reputation-system,

however, found examples showing can use will_paginate page , per methods:

perhaps work this:

micropost.page(params[:page]).per(30).find_with_reputation(:votes, :all, order: "votes desc") 

or model scope this:

def self.popular   find_with_reputation(:votes, :all, order: 'votes desc') end 

you this:

micropost.page(params[:page]).per(30).popular 

also, side note, routes file little strange multiple member blocks, when 1 necessary. make this:

resources :microposts, only: [:create, :destroy, :index]   member     post :vote     post :retweet   end end 

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -