TODO N+1
Introduction
Ruby on Rails ORM has lazy loading enabled.
Example
# Post Model
class Post < ActiveRecord::Base
belongs_to :author
end
# Author Model
class Author < ActiveRecord::Base
has_many :posts
end# Controller
class PostsController < ApplicationController
def index
@posts = Post.order(created_at: :desc)
end
endCase 1: Default - lazy loading
N+1
Case 2.1: preload - eager loading / separated queries
preload - eager loading / separated queriesNo N+1
Fail @ order posts by author name
Fail @ find posts by author name
Case 2.2: eager_load - eager loading / one query
eager_load - eager loading / one queryorder posts by author name
find posts by author name
single query and LEFT OUTER JOINcan also be very expensive.
Case 2.3 includes - smarter
includes - smarter(same as preload)
order posts by author name (same as eager_load)
find posts by author name (same as eager_load)
Last updated
Was this helpful?