Traverse an ActiveRecord relation along an association
The
Edge Rider gem
Show archive.org snapshot
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:
class Post < ActiveRecord::Base
belongs_to :author
end
To turn a relation of posts into a relation of its authors:
posts = 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:
posts = 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.