ActiveRecord Extras
ActiveRecord Extras provides helpful utility methods and query extensions for ActiveRecord models.
It focuses on building SQL subqueries for has_many
associations using EXISTS
and COUNT
, while keeping full composability within ActiveRecord queries.
Features
-
exists_association
andcount_association
methods for Arel-based subqueries - Scopes:
with_existing(:association)
without_existing(:association)
- Extended select support:
-
with_counts(:association)
— includes counts in result sets - Accepts optional block for filtering join conditions
-
- Fully composable ActiveRecord relations
- No monkey-patching, Rails 6+ compatible
Installation
Add to your Gemfile
:
gem "activerecord_extras"
Then run:
bundle install
Or install manually:
gem install activerecord_extras
Usage
with_existing
and without_existing
User.with_existing(:posts)
User.without_existing(:comments)
with_counts
Adds a SELECT COUNT(*)
subquery per association:
User.with_counts(:posts)
Supports filtering via block:
User.with_counts(:posts) do |join_condition, posts|
join_condition.and(posts[:published].eq(true))
end
This produces SQL like:
SELECT users.*, (
SELECT COUNT(*) FROM posts
WHERE posts.user_id = users.id AND posts.published = TRUE
) AS posts_count
API Reference
exists_association(association_name, &block)
Returns an Arel EXISTS subquery.
count_association(association_name, &block)
Returns a grouped COUNT(*) Arel subquery.
with_counts(*association_names, &block)
Selects all columns from the model and adds one COUNT subquery per named association. The optional block modifies join conditions.
Development
bundle exec rake test
Tests use SQLite in-memory schema and require no database setup.
License
MIT License © Till Schulte-Coerne