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 № 1No 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.