Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

acts_as_votable ordering by upvotes

I haven't been able to find anything that works so far for ordering questions by number of upvotes using the acts_as_votable gem.

Here are my upvote and index methods:

 def upvote
  @question = Question.find params[:id]
  @question.liked_by current_user
  redirect_to comment_questions_path
 end

 def index
 @comment = Comment.find params[:comment_id]
 @questions = @comment.questions
 end

and my questions view:

<%= div_for(question) do %>
<% if question.votes.size > 0 %>
<div class="verifiedanswer">
<%= question.body %>
</div>

<% else %>
<div class="answercontainer2">
<%= question.body %>
</div>
<% end %>

What should I put in the view and the controller to make this work?

like image 593
user2759575 Avatar asked Sep 30 '13 20:09

user2759575


1 Answers

This particular gem has a caching migration you can run as well.

https://github.com/ryanto/acts_as_votable#caching

class AddCachedVotesToPosts < ActiveRecord::Migration
  def self.up
    add_column :posts, :cached_votes_total, :integer, :default => 0
    add_column :posts, :cached_votes_score, :integer, :default => 0
    add_column :posts, :cached_votes_up, :integer, :default => 0
    add_column :posts, :cached_votes_down, :integer, :default => 0
    add_index  :posts, :cached_votes_total
    add_index  :posts, :cached_votes_score
    add_index  :posts, :cached_votes_up
    add_index  :posts, :cached_votes_down

    # Uncomment this line to force caching of existing votes
    # Post.find_each(&:update_cached_votes)
  end

  def self.down
    remove_column :posts, :cached_votes_total
    remove_column :posts, :cached_votes_score
    remove_column :posts, :cached_votes_up
    remove_column :posts, :cached_votes_down
  end
end

My suggestion would be to create a new migration with the sample code and use that to sort against.

Once you've created that migration, you can sort on one of those columns:

http://guides.rubyonrails.org/active_record_querying.html#ordering

For example:

<% Post.order(:cached_votes_up).each do |post| %>
  ... html goodness here ...
<% end %>

That will sort by the number of up votes.

like image 53
Farley Knight Avatar answered Nov 06 '22 06:11

Farley Knight