aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation.rb
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2018-09-30 18:30:47 +0900
committerRyuta Kamizono <kamipo@gmail.com>2018-09-30 21:21:54 +0900
commit859fba7c4bf7d33b4f9655914ed4bdc85380552e (patch)
treefd777f6b29c1b02575248e3dfe4cfcba13968472 /activerecord/lib/active_record/relation.rb
parent298629cefd845caf2cea28eb9cee2b538accc4ee (diff)
downloadrails-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/relation.rb')
-rw-r--r--activerecord/lib/active_record/relation.rb5
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