Как вернуть обновленные записи с помощью 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,

Другие вопросы по тегам