diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-09-30 18:30:47 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2018-09-30 21:21:54 +0900 |
commit | 859fba7c4bf7d33b4f9655914ed4bdc85380552e (patch) | |
tree | fd777f6b29c1b02575248e3dfe4cfcba13968472 /activerecord/lib/active_record | |
parent | 298629cefd845caf2cea28eb9cee2b538accc4ee (diff) | |
download | rails-859fba7c4bf7d33b4f9655914ed4bdc85380552e.tar.gz rails-859fba7c4bf7d33b4f9655914ed4bdc85380552e.tar.bz2 rails-859fba7c4bf7d33b4f9655914ed4bdc85380552e.zip |
Handle DELETE with LIMIT in Arel
MySQL supports DELETE with LIMIT and ORDER BY.
https://dev.mysql.com/doc/refman/8.0/en/delete.html
Before:
```
Post Destroy (1.0ms) DELETE FROM `posts` WHERE `posts`.`id` IN (SELECT `id` FROM (SELECT `posts`.`id` FROM `posts` WHERE `posts`.`author_id` = ? ORDER BY `posts`.`id` ASC LIMIT ?) __active_record_temp) [["author_id", 1], ["LIMIT", 1]]
```
After:
```
Post Destroy (0.4ms) DELETE FROM `posts` WHERE `posts`.`author_id` = ? ORDER BY `posts`.`id` ASC LIMIT ? [["author_id", 1], ["LIMIT", 1]]
```
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/relation.rb | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index db06bd9e26..5bad5bfcc2 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -484,9 +484,12 @@ module ActiveRecord stmt = Arel::DeleteManager.new stmt.from(table) - if has_join_values? || has_limit_or_offset? + if has_join_values? || offset_value @klass.connection.join_to_delete(stmt, arel, arel_attribute(primary_key)) else + stmt.key = arel_attribute(primary_key) + stmt.take(arel.limit) + stmt.order(*arel.orders) stmt.wheres = arel.constraints end |