diff --git a/config/initializers/active_record.rb b/config/initializers/active_record.rb index a3a4fdb0ea4..651bc0c2bf7 100644 --- a/config/initializers/active_record.rb +++ b/config/initializers/active_record.rb @@ -870,17 +870,9 @@ ActiveRecord::Relation.class_eval do alias_method_chain :delete_all, :joins def delete_all_with_limit(conditions = nil) - if limit_value - case connection.adapter_name - when 'MySQL', 'Mysql2' - v = arel.visitor - sql = "DELETE #{quoted_table_name} FROM #{quoted_table_name} #{arel.where_sql} - ORDER BY #{arel.orders.map { |x| v.send(:visit, x) }.join(', ')} LIMIT #{v.send(:visit, arel.limit)}" - return connection.delete(sql, "#{name} Delete all") - else - scope = except(:select).select("#{quoted_table_name}.#{primary_key}") - return unscoped.where(primary_key => scope).delete_all - end + if limit_value || offset_value + scope = except(:select).select("#{quoted_table_name}.#{primary_key}") + return unscoped.where(primary_key => scope).delete_all end delete_all_without_limit(conditions) end diff --git a/spec/models/active_record_base_spec.rb b/spec/models/active_record_base_spec.rb index 277bfd908c0..8a10cd69399 100644 --- a/spec/models/active_record_base_spec.rb +++ b/spec/models/active_record_base_spec.rb @@ -548,6 +548,17 @@ describe ActiveRecord::Base do p1.reload expect { p2.reload }.to raise_error(ActiveRecord::RecordNotFound) end + + it "does offset too" do + u = User.create! + p1 = u.pseudonyms.create!(unique_id: 'a', account: Account.default) + p2 = u.pseudonyms.create!(unique_id: 'b', account: Account.default) + p3 = u.pseudonyms.create!(unique_id: 'c', account: Account.default) + u.pseudonyms.scoped.reorder("unique_id DESC").limit(1).offset(1).delete_all + p1.reload + expect { p2.reload }.to raise_error(ActiveRecord::RecordNotFound) + p3.reload + end end describe "add_index" do