2015-01-07 3 views
0

Итак, у меня есть 2 поля в моей таблице статей.Rails обновляет базу данных в соответствии с двумя другими полями

- :vote_up 
- :vote_down 

У меня есть методы в моем приложении по обновлению полей: vote_up и: vote_down, которые отлично работают. То, что я хочу сделать, - это заказать мои статьи общим количеством голосов (: vote_up минус: vote_down).

Каков наилучший способ для этого. Могу ли я сделать это непосредственно в контроллере с помощью определенного метода? Или я должен создать поле: vote_total, которое автоматически обновляется в соответствии со значениями двух других полей (если да, как вы это делаете).

Большое спасибо!

ответ

1

Не делайте этого в своем контроллере. Это должно быть сделано в вашей модели. Контроллеры должны просто использовать модель.

Вы можете сделать это 2 способами:

Решение 1

Попробуйте это в консоли (рельсы с)

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 и обновлять его каждый раз, когда один из полого голосования обновляется (используйте before_save обратный вызов). Тогда вы можете сделать то же самое, что и в решении 1, но без части select.

Предложение

Я бы с раствором 2, потому что среди прочего он быстрее в запросах

Надеется, что это помогает.

+0

Эй, думаю, для этого. Я закончил решение 2, но немного другое. Опубликовал мой рабочий ответ ниже – MikeHolford

0

Спасибо @Hiasinho за ваше руководство. Я в конечном итоге просто создание: vote_total к моей статье базы данных и обновлять его на обоих моих upvote и downvote методы, как так

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

Очевидно, это было -1 для downvotes.