Commit a9df7147 authored by Yorick Peterse's avatar Yorick Peterse

Use a subquery with IDs only for find_by_any_email

This further improves performance of User.find_by_any_email and is
roughly twice as fast as the previous UNION setup.

Thanks again to @dlemstra for suggesting this.
parent bba46623
...@@ -235,15 +235,13 @@ class User < ActiveRecord::Base ...@@ -235,15 +235,13 @@ class User < ActiveRecord::Base
# Find a User by their primary email or any associated secondary email # Find a User by their primary email or any associated secondary email
def find_by_any_email(email) def find_by_any_email(email)
# Arel doesn't allow for chaining operations on union nodes, thus we have sql = 'SELECT *
# to write this query by hand. See the following issue for more info: FROM users
# https://github.com/rails/arel/issues/98. WHERE id IN (
sql = '(SELECT * FROM users WHERE email = :email) SELECT id FROM users WHERE email = :email
UNION UNION
(SELECT users.* SELECT emails.user_id FROM emails WHERE email = :email
FROM emails )
INNER JOIN users ON users.id = emails.user_id
WHERE emails.email = :email)
LIMIT 1;' LIMIT 1;'
User.find_by_sql([sql, { email: email }]).first User.find_by_sql([sql, { email: email }]).first
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment