Я использую драгоценный камень Thumbs_up в проекте, где пользователь пишет отзывы, а другие пользователи голосуют за них. Я столкнулся с той же проблемой и нашел решение ниже. Это не элегантно, но работает. Я надеюсь, что кто-то более опытный сможет предложить лучшее решение.
В моей пользовательской модели у меня есть:
class User < ActiveRecord::Base
acts_as_voter
has_karma(:chapters, :as => :user) # tracks "up votes" for all a user's chapters
has_many :reviews
end
Модель моих обзоров имеет атрибут: voice_cnt и столбец БД, которые я обновляю при каждом голосовании:
class Review < ActiveRecord::Base
attr_accessible :heading, :body, :notes, :published, :user_id, :vote_cnt
acts_as_voteable
belongs_to :user
###############################################################################
# update the vote_cnt field in the database, for sorting and query purposes.
def update_vote_count
if self.vote_count != self.vote_cnt
self.vote_cnt = self.vote_count
self.save
end
end
end
В контроллере отзывов есть действие для обработки нажатия на ссылку голосования в моем обзоре:
################################################################
def vote_for
@review = Review.find(params[:id])
begin # try-rescue
current_user.vote_for(@review)
@review.update_vote_count
redirect_to review_path( @review ), :notice => "Successfully voted for this review."
rescue
redirect_to review_path( @chapter ), :notice => "Sorry, can't vote for a review twice, or you don't have voting rights."
end
end
Теперь, после всего этого, я наконец могу получить набор отзывов, доступных current_user, упорядоченных по подсчету голосов отзывов:
@reviews =@user.reviews.accessible_by(current_ability).order("vote_cnt DESC")
Как я уже сказал, не элегантно, но работает. Вы можете структурировать свои микросообщения так, как я структурировал свои обзоры, и это должно работать для вас. Надеюсь, это поможет вам.