/ / Поле за актуализация на базата данни Rails според две други полета - ruby-on-rails, база данни, sql-актуализация, вот

Полето за актуализация на базата данни за релси в съответствие с други две полета - ruby-on-rails, база данни, sql-актуализация, вот

Така че имам 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.