Странное расхождение между значением базы данных и отображаемым значением - PullRequest
0 голосов
/ 20 марта 2011

Итак, я реализовал систему голосования, и, на мой взгляд, где я печатаю video.vote_sum, значение для одного из видеоизображений voice_sum отображается как 1. Однако, когда я запускаю Video.find(450) в своей консоли, я вижу, что элементна самом деле есть элемент voice_sum, равный двум.Я не уверен, почему это происходит, и хотя голосование работает должным образом, при перезагрузке страницы метод pluralize, на мой взгляд, отображает «1 голос».Но это только после перезагрузки страницы.Когда я голосую, отображается «1 голос».Странно.

Вот метод create в контроллере video_votes:

def create       
  @video = Video.find(params[:video_id])
  @vote = current_user.video_votes.find_or_create_by_video_id(@video.id)

  if @vote.value.nil?
    if params[:type] == "up"
      @vote.value = 1
    else
      @vote.value = -1
    end
  elsif (params[:type] == "up" && @vote.value == 1) || (params[:type] == "down" && @vote.value == -1)
    @vote.value = 0
  elsif ((params[:type] == "up" && @vote.value == -1) || (params[:type] == "down" && @vote.value == 1)) || (@vote.value == 0)
    if params[:type] == "up"
      @vote.value = 1
    else
      @vote.value = -1
    end
  end  

  if @vote.save
    respond_to do |format|
      format.html { redirect_to @video }
      format.js
    end
  else
    respond_to do |format|
      format.html { redirect_to @video }
      format.js {render 'fail_create.js.erb'}
    end
  end  
end

Вот соответствующий код в моей модели видео:

def vote_sum
  video_votes.sum(:value)
end

А вот соответствующий код вмоя модель video_vote:

after_update :update_vote_sum

private

  def update_vote_sum
    video.update_attributes!(:vote_sum => video.vote_sum + value)
  end

Почему это происходит и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 20 марта 2011

Я считаю, что это проблема с вашим представлением и тем, как вы используете pluralize - вы должны передать его в единственном числе, а , необязательно, во множественном числе (в случае, если он не может угадать это правильно).

Пожалуйста, смотрите мои изменения на GitHub .

Вот скриншот:

Screenshot

[Обновить]

После того, как вы связались с вашим приложением, каким-то образом можно получить video.vote_sum (фактическое значение базы данных), отличное от video.video_votes.sum(:value);Я еще не уверен, почему.Однако у вас есть еще одна проблема с вашей кодовой базой, показанная ниже:

ruby-1.9.2-p136 :001 > v = Video.find 2
 => #<Video id: 2, ... video_votes_count: 0, vote_sum: 3> 
ruby-1.9.2-p136 :002 > v.video_votes.sum(:value)
 => 2 
ruby-1.9.2-p136 :003 > v.vote_sum
 => 2 # doesn't match vote_sum in the database!

У вас есть метод с именем vote_sum в вашей Video модели. Это означает, что при доступе к @video.vote_sum, вы НЕ получаете доступ к свойству vote_sum из модели из базы данных, поскольку вы перезаписываете эту функцию.Это делает бессмысленным обновление vote_sum в VideoVote after_create, потому что вы никогда не сможете получить к нему доступ (как показано выше в моем сеансе IRB).

0 голосов
/ 20 марта 2011

Вы должны перезагрузить видео:

if @vote.save
  @video.reload
  respond_to do |format|
    format.html { redirect_to @video }

Может быть другой способ перезагрузить vote_sum только без перезагрузки @video, но этого должно быть достаточно для начала.


Также обратите внимание, что вы могли бы лучше использовать модель :counter_cache, если бы вы разделили up и down голосов для разделения отношений / моделей ... это грустно, но иногда, чтобы получить полную мощность рельсов, вам нужно делайте причудливые вещи со своими моделями.

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