DEV: pluck_first

Doing .pluck(:column).first is a very common pattern in Discourse and in
most cases, a limit cause isn't being added. Instead of adding a limit
clause to all these callsites, this commit adds two new methods to
ActiveRecord::Relation:

pluck_first, equivalent to limit(1).pluck(*columns).first

and pluck_first! which, like other finder methods, raises an exception
when no record is found
This commit is contained in:
Daniel Waterworth
2019-10-21 11:32:27 +01:00
parent 72822aa93f
commit 55a1394342
43 changed files with 99 additions and 80 deletions

View File

@@ -0,0 +1,19 @@
# frozen_string_literal: true
class ActiveRecord::Relation
def pluck_first(*attributes)
limit(1).pluck(*attributes).first
end
def pluck_first!(*attributes)
items = limit(1).pluck(*attributes)
raise_record_not_found_exception! if items.empty?
items.first
end
end
module ActiveRecord::Querying
delegate(:pluck_first, :pluck_first!, to: :all)
end