Skip to main content

using_arel_for_complex_queries

🔍 Leveraging Arel for Complex Queries

When ActiveRecord scopes hit complexity limits, use Arel to build composable SQL expressions while still benefiting from parameterization and injection safety. Arel nodes can represent tables, columns, and SQL operators.

class User < ApplicationRecord
def self.with_balance_and_recent_login(min_balance, days)
users = arel_table
login = Login.arel_table

join_condition = users[:id].eq(login[:user_id])
min_balance_condition = users[:balance].gteq(min_balance)
recent_login_condition = login[:created_at].gt(days.days.ago)

joins(users.join(login).on(join_condition).join_sources)
.where(min_balance_condition.and(recent_login_condition))
end
end

# Usage
def expensive_active_users
User.with_balance_and_recent_login(1000, 7)
end