add offset support to delete_all

Change-Id: I102ba8628d60dbaeea8ebeb9335c655bc822648e
Reviewed-on: https://gerrit.instructure.com/69453
Reviewed-by: Simon Williams <simon@instructure.com>
Tested-by: Jenkins
Product-Review: Cody Cutrer <cody@instructure.com>
QA-Review: Cody Cutrer <cody@instructure.com>
This commit is contained in:
Cody Cutrer 2015-12-28 11:26:51 -07:00
parent 3bf7828ad6
commit e39fb6d8c0
2 changed files with 14 additions and 11 deletions

View File

@ -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

View File

@ -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