Traverse an ActiveRecord relation along an association
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)
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.