Как вернуть обновленные записи с помощью Sequel Gem при массовом обновлении
Я использую гем Sequel для массового обновления пользователей в MySql.
users = Users.filter(:id => ids).all
raise if users.nil?
updated_users = Users.filter(:id => addon_ids).update({deleted: 1, moderator_id: moderator_id})
p updated_users
# => 3
Согласно документации сиквела,
msgstr "update [and delete] должен вернуть количество затронутых строк..."
Таким образом, ожидаемое выше поведение ожидается, но мой вопрос заключается в следующем: как заставить гем Sequel возвращать обновленные записи вместо числа затронутых записей?
Я ожидаю такого поведения:
users = Users.filter(:id => ids).all
raise if users.nil?
updated_users = Users.filter(:id => addon_ids).update({deleted: 1, moderator_id: moderator_id})
p updated_users
# => [#<Users @values={:id=>1, :moderator_id=>"testuser", :deleted=>1}>, #<Users @values={:id=>2, :moderator_id=>"testuser", :deleted=>1}>, #<Users @values={:id=>3, :moderator_id=>"testuser", :deleted=>1}>]
2 ответа
Для людей, которые могут все еще искать это, в зависимости от вашей базы данных вы можете использовать returning
,
updated_users = Users.returning.filter(:id => addon_ids).update({deleted: 1, moderator_id: moderator_id})
p updated_users
# => [#<Users @values={:id=>1, :moderator_id=>"testuser", :deleted=>1}>, #<Users @values={:id=>2, :moderator_id=>"testuser", :deleted=>1}>, #<Users @values={:id=>3, :moderator_id=>"testuser", :deleted=>1}>]
Документы: http://www.rubydoc.info/github/jeremyevans/sequel/Sequel%2FDataset%3Areturning
Что ж, это то, что возвращают БД, поэтому Sequel делает то, что от него ожидает разработчик. Вместо этого сделайте это:
users = Users.where(:id => ids)
raise if users.empty?
updated_users = Users.where(:id => addon_ids)
updated_users.update({deleted: 1, moderator_id: moderator_id})
p updated_users
# => [#<Users @values={:id=>1, :moderator_id=>"testuser", :deleted=>1}>, #<Users @values={:id=>2, :moderator_id=>"testuser", :deleted=>1}>, #<Users @values={:id=>3, :moderator_id=>"testuser", :deleted=>1}>]
Таким образом, вы не назначаете количество затронутых строк updated_users
,