Ruby on Rails ActiveRecord: оптимизация приращения на один

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

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

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

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

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

Ответы

Ответ 1

Tag.increment_counter :popularity, id

Это не только пропускает выделение, но и увеличивается атомарно.

Ответ 2

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

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

или

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

?