Така че имам 2 полета в таблицата си с членове.
- :vote_up
- :vote_down
В приложението си имам методи за актуализиране на полетата: vote_up и: vote_down, които работят добре. Това, което искам да направя, е да поръчам моите статии по общо гласове (: vote_up минус: vote_down).
Кой е най-добрият начин за това. Мога ли да направя това директно в контролера с определен метод? Или трябва да създам: vote_total поле, което се актуализира автоматично според стойностите на другите две полета (ако да, как да направите това).
Много благодаря!
Отговори:
1 за отговор № 1Не правете това в контролера си. Това е предназначено да се направи във вашия модел. Контролерите трябва просто да използват модела.
Можете да направите това по 2 начина:
Решение 1
Опитайте това в конзолата си (релси c)
Article
.unscoped
.select(%q(articles.*, (articles.vote_up - articles.vote_down) AS vote_total))
.order(%q(vote_total DESC))
и го внедрете като обхват във вашия Article
клас
scope :order_by_total_votes, -> {
select(%q(articles.*, (articles.vote_up - articles.vote_down) AS vote_total))
.order(%q(vote_total DESC))
}
Решение 2
Създайте поле vote_total
за вашия Article
и го актуализирайте всеки път, когато едно от полетата за гласуване се актуализира (използвайте a before_save
обаждане). Тогава можете да направите същото като в разтвор 1, но без select
част.
Внушение
Бих отишла с решение 2, тъй като наред с други е по-бързо в заявките
Надявам се това да помогне.
0 за отговор № 2
Благодаря @Hiasinho за вашата посока. Аз в крайна сметка просто създадох: vote_total към моята база данни Article и я актуализирах както върху моите upvote и downvote методи като така
@article.update_attributes(vote_total: @article.vote_total + 1)
Очевидно беше -1 за downvotes.