Adds includes method to ActiveRecord instances
Why is this needed?
Sometimes you don't have access to the code that instantiates a particular ActiveRecord
instance, so you can't call includes
on the class or ActiveRecord::Relation
instance to eager load associations.
For example:
# Defines the @post instance variable for us
load_and_authorize_resource
def show
render @post
end
Normally this isn't a problem, because if you have a single instance, it's not possible to encounter a N+1 query while working with that instance or any of its direct associations.
%h1= @post.title
%ul
- @post.authors.each do |author|
%li= author.name
The problem occurs with more complex (deeply nested) processing, and you have to crawl over the data of nested has_many associations.
%ul
- @post.authors.each do |author|
-# Causes a N+1 query problem:
%li= "#{author.name} (#{author.nicknames.pluck(:value).join(',')})
That's when you need activerecord-instance_includes
:
@post.includes(authors: [:nicknames])
Installation
Add this line to your application's Gemfile:
gem 'activerecord-instance_includes'
And then execute:
$ bundle
Or install it yourself as:
$ gem install activerecord-instance_includes
Usage
Just call includes
on ActiveRecord instances in the same way you would normally do so for the ActiveRecord class or ActiveRecord::Relation
instance.
The #includes
method returns the ActiveRecord instance itself so you can chain method calls:
%ul
- @post.includes(authors: [:nicknames]).authors.each do |author|
%li= "#{author.name} (#{author.nicknames.pluck(:value).join(',')})