Заказать микросообщений голосованием - PullRequest
0 голосов
/ 30 апреля 2011

Я не могу понять, как форматировать код здесь. Я повторил вопрос здесь (более хорошим способом): http://railsforum.com/viewtopic.php?id=43839

Иметь простой сайт микросообщений с функцией голосования. Я хочу, чтобы можно было отображать опубликованные микросообщения по адресу voices.size. Я не могу заставить его работать, и был бы признателен за некоторые рекомендации.

МОДЕЛЬ:

class Micropost
  attr_accessible :content
  has_many :votes 
  belongs_to :user 
  default_scope :order => 'microposts.created_at DESC'


class Vote
  belongs_to :micropost

МНЕНИЯ:

# microposts page
<% unless @picture.microposts.empty? %>
  <table class="microposts" summary="User microposts">
    <%= render @microposts %>
  </table>
<% end %>

# microposts partial
<tr>
  <td class="micropost">   
    <span class="gravatar">     
      <%= link_to gravatar_for(micropost.user, :size => '60'), micropost.user %>
    </span>
    <span class="content" >
      <%= micropost.content %>
    </span>
    <span id="vote_total_<%= micropost.id %>" class="micropost_votes">
      votes:<%= micropost.votes.size %>
    </span>
  <% if current_page?(root_path) && signed_in? %>
    <span id="vote_button">
      <%= button_to 'vote', micropost_votes_path(:micropost_id => micropost),
          :remote => true 
      %>
    </span>
  <% end %>  
  </td>
</tr>

КОНТРОЛЛЕРЫ:

# VotesController
def create
  @micropost = Micropost.find(params[:micropost_id])
  @vote      = @micropost.votes.build params[:micropost_id]

  respond_to do |format|
    if @vote.save
      format.html { redirect_to @micropost }
      format.js        
    else
      format.html { redirect_to root }
    end
  end
end

Мне удалось отсортировать микросообщения по дате создания, но я не могу отсортировать микросообщения по micropost.votes.size Похоже, что-то связано с заказом одной модели на основе состояния другой модели.

Ответы [ 2 ]

1 голос
/ 30 апреля 2011
Micropost.all(:select => "#{Micropost.table_name}.*, COUNT(#{Vote.table_name}.id) number_of_votes",
         :joins => :votes,
         :order => "number_of_votes desc")
0 голосов
/ 12 мая 2011

Ну, это было лучшее решение, которое я нашел.В представлении, где обрабатываются микросообщения, я добавил:

.sort_by { |micropost| micropost.votes.size }

Таким образом, фактический код рендеринга выглядит так:самые высокие итоги голосования были на вершине.Это легко:

<%= render @microposts.sort_by { |micropost| micropost.votes.size }.reverse %>

Я понятия не имею, создаст ли это проблемы с производительностью базы данных, но, похоже, работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...