/ / Extraña discrepancia entre el valor de la base de datos y la visualización del valor a la vista: ruby-on-rails, ruby, ruby-on-rails-3

Extraña discrepancia entre el valor de la base de datos y la visualización del valor a la vista: ruby-on-rails, ruby, ruby-on-rails-3

Así que implementé un sistema de votación y, en mi opinión, donde imprimo video.vote_sum, el valor de la suma de voto de uno de los videos muestra 1. Sin embargo, cuando ejecuto Video.find(450) en mi consola, veo que el elemento en realidad tiene un vote_sum de dos. No estoy seguro de por qué sucede esto, y aunque la votación funciona como debería, cuando recargo la página, el pluralize En mi opinión, el método muestra "1 votos". Pero esto es solo al recargar una página. Cuando estoy votando, muestra "1 voto". Extraño.

Aquí está el método de creación en el controlador 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

Aquí está el código relevante en mi modelo de video:

def vote_sum
video_votes.sum(:value)
end

Y aquí está el código relevante en mi modelo de video_vote:

after_update :update_vote_sum

private

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

¿Por qué sucede esto y cómo puedo solucionarlo?

Respuestas

0 para la respuesta № 1

Creo que esto es un problema con tu vista y la forma en que estás usando pluralize- se supone que debes pasarle la versión singular de tu sustantivo, y opcionalmente una versión plural (en caso de que no pueda adivinarla correctamente).

Por favor mira mi cambio en GitHub.

Aquí hay una captura de pantalla:

Captura de pantalla

[Actualizar]

Después de jugar con su aplicación, de alguna manera es posible obtener video.vote_sum (el valor real de la base de datos) sea diferente de video.video_votes.sum(:value); Todavía no estoy seguro de por qué. Sin embargo, tiene otro problema con su código base, que se muestra a continuación:

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!

Tienes un método llamado vote_sum en tu Video modelo. Esto significa que cuando accedes @video.vote_sum, NO está accediendo al vote_sum propiedad del modelo de la base de datos, porque sobrescribe esa funcionalidad. Esto hace que no tenga sentido actualizar vote_sum en VideoVote"s after_create porque nunca puede acceder a él (como se demostró en mi sesión de IRB, arriba).


0 para la respuesta № 2

Deberías volver a cargar el video:

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

Puede haber otra forma de recargar vote_sum solo sin recargar @video pero esto debería ser suficiente para empezar.


También tenga en cuenta que podría tener un mejor uso del modelo :counter_cache cuando te separarías up y down vota para separar relaciones / modelos ... es triste, pero a veces para obtener toda la potencia de los rieles necesitas hacer cosas raras con tus modelos.