Traverse an ActiveRecord relation along an association
The
Edge Rider gem
Archive
gives your relations a method #traverse_association
which
returns a new relation by "pivoting" around a named association.
Say we have a Post
model and each Post
belongs to an author:
Copyclass Post < ActiveRecord::Base belongs_to :author end
To turn a relation of posts into a relation of its authors:
Copyposts = Post.where(:archived => false) authors = posts.traverse_association(:author)
You can traverse multiple associations in a single call.
E.g. to turn a relation of posts into a relation of all posts of their authors:
Copyposts = Post.where(:archived => false) posts_by_same_authors = posts.traverse_association(:author, :posts)
Implementation note
The traversal is achieved internally by collecting all foreign keys in the current relation
and return a new relation with an IN(...)
query (which is very efficient even for many thousand keys).
This means every association that you pivot around will trigger one SQL query.
Your development team has a full backlog of feature requests, chores and refactoring coupled with deadlines? We are familiar with that. With our "DevOps as a Service" offering, we support developer teams with infrastructure and operations expertise.