Ruby on Rails ActiveRecord: оптимизация приращения на единицу - PullRequest
14 голосов
/ 24 февраля 2011

У меня есть идентификатор записи, который popularity должен быть увеличен на единицу.

Простое решение выглядит так:

Tag.find(id).increment!(:popularity)

Однако, похоже, оно неочень эффективно, потому что я выбираю всю запись (*) из базы данных (даже если она мне вообще не нужна), а затем выполняю второй запрос для ее обновления.

Есть ли более эффективный способсделай это?Я думаю, одного оператора обновления (без "select") должно быть достаточно, но как мне написать это?

Ответы [ 2 ]

26 голосов
/ 24 февраля 2011
Tag.increment_counter :popularity, id

Мало того, что это пропускает выбор, но также увеличивается атомно.

2 голосов
/ 24 февраля 2011

Может быть что-то вроде:

Tag.update_all("popularity = popularity + 1", {:id => id})

Или

Tag.where(:id => id).update_all("popularity = popularity + 1")

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...