Проблема с кешированием с помощью thumbs_up gem - PullRequest
3 голосов
/ 05 марта 2012

Драгоценный камень thumbs_up на github не объясняет, как кэшировать голоса в другой модели.

Этот драгоценный камень thumbs_up подключен к пользователю и микросообщению, и я хочу создать столбец для порядка таблицы микросообщений, чтобы подсчитать количество голосов, которое имеет микросообщение.

Я делаю это, чтобы сортировать микросообщений по количеству голосов. Все предложения приветствуются!

Также для тех, кто не знаком с этим драгоценным камнем, вот оно: https://github.com/brady8/thumbs_up

1 Ответ

1 голос
/ 07 марта 2012

Я использую драгоценный камень 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")

Как я уже сказал, не элегантно, но работает. Вы можете структурировать свои микросообщения так, как я структурировал свои обзоры, и это должно работать для вас. Надеюсь, это поможет вам.

...