Как проверить, действительно ли update_all обновлялся в Rails - PullRequest
5 голосов
/ 17 февраля 2011

Учитывая этот код

def create
  @upgrades = User.update_all(["role = ?","upgraded"], :id => params[:upgrade])
  redirect_to admin_upgrades_path, :notice => "Successfully upgraded user."    
end

Как я могу на самом деле проверить в этом действии, были ли они сохранены или нет перенаправить на соответствующую страницу и сообщение?

1 Ответ

8 голосов
/ 17 февраля 2011

В Rails3 update_all не возвращает никакой значимой информации, кроме количества обновленных записей (это может зависеть от того, вернет ли ваша СУБД эту информацию).

http://ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000343

Он НЕ создает экземпляры каких-либо объектов, вы можете убедиться в этом, посмотрев журнал.

Если у меня в базе данных есть ID пользователя 4 и 5 (и ничего другого), вот что я получу:

irb(main):007:0> u = User.update_all( "id = id", :id => 5 ) 
=> 1
irb(main):008:0> u = User.update_all( "id = id", :id => 55 )
=> 0
irb(main):009:0> u = User.update_all( "id = id", :id => [4,5] )
=> 2
irb(main):010:0> u = User.update_all( "id = id", :id => [4,53] )
=> 1
irb(main):011:0> u.class
=> Fixnum

Если вы хотите получить записи, которые были изменены, вы должны использовать «update», передать список значений ID, и тогда вы получите экземпляры объектов.

Обратите внимание, что если у вас много идентификаторов, вы можете легко переполнить память вашего сервера, создав слишком много объектов.

Другой способ, о котором я мог подумать, - это сначала выполнить запрос объектов, которые будут обновлены (использовать группировку объектов и выбирать только те атрибуты из таблицы, которые вам нужно отобразить, тем самым экономя память), сгенерировать отчет, затем выполните запрос Update_All ...

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