/ / Rails actualiza el campo de la base de datos de acuerdo con otros dos campos: ruby-on-rails, database, sql-update, vote

Rails actualiza el campo de la base de datos de acuerdo con otros dos campos: ruby-on-rails, base de datos, actualización de sql, votación

Entonces tengo 2 campos en mi tabla de Artículos.

- :vote_up
- :vote_down

Tengo métodos en mi aplicación para actualizar los campos: vote_up y: vote_down que funcionan bien. Lo que quiero hacer es ordenar mis artículos por votos totales (: vote_up menos: vote_down).

Cuál es la mejor manera de hacer esto.¿Puedo hacer esto directamente en el controlador con un método determinado? O debo crear un campo: vote_total que se actualice automáticamente de acuerdo con los valores de los otros dos campos (si es así, cómo se hace esto).

¡Muchas gracias!

Respuestas

1 para la respuesta № 1

No hagas esto en tu controlador. Esto debe hacerse en tu modelo. Los controladores solo deben usar el modelo.

Puede hacer esto de 2 formas:

Solución 1

Prueba esto en tu consola (rieles c)

Article
.unscoped
.select(%q(articles.*, (articles.vote_up - articles.vote_down) AS vote_total))
.order(%q(vote_total DESC))

e implementarlo como un alcance en su Article clase

scope :order_by_total_votes, -> {
select(%q(articles.*, (articles.vote_up - articles.vote_down) AS vote_total))
.order(%q(vote_total DESC))
}

Solución 2

Crea un campo vote_total para tu Article y actualícelo cada vez que se actualice uno de los campos de votación (use un before_save llamar de vuelta). Entonces puede hacer lo mismo que en la solución 1, pero sin el select parte.

Sugerencia

Yo iría con la solución 2, porque entre otras es más rápida en las consultas.

Espero que esto ayude.


0 para la respuesta № 2

Gracias @Hiasinho por tu dirección. Terminé creando un: vote_total en mi base de datos de artículos y lo actualicé en mis métodos de voto a favor y en contra.

@article.update_attributes(vote_total: @article.vote_total + 1)

Obviamente, fue un -1 para los votos negativos.