Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions app/models/alchemy/json_api/page.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ def ancestor_ids
def element_repository
return Alchemy::ElementsRepository.none unless page_version

# Need to use select here, otherwise rails would not eager load the elements correctly
Alchemy::ElementsRepository.new(page_version.elements.select(&:public))
Alchemy::ElementsRepository.new(page_version.elements).visible
end
end
end
Expand Down
42 changes: 42 additions & 0 deletions spec/requests/alchemy/json_api/pages_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,48 @@
end
end

context "with elements" do
def create_page_with_element
page = FactoryBot.create(:alchemy_page, :public)
FactoryBot.create(
:alchemy_element,
page_version: page.public_version,
name: "article",
autogenerate_ingredients: true
)
page
end

# Only counts full record loads, so the id only queries the etag generation
# runs for every page do not hide a per page element load.
def count_element_load_queries
queries = []
subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |_name, _start, _finish, _id, payload|
next if payload[:name] == "SCHEMA" || payload[:cached]
queries << payload[:sql] if payload[:sql].include?(%("alchemy_elements"."name"))
end
yield
queries.size
ensure
ActiveSupport::Notifications.unsubscribe(subscriber)
end

it "loads elements eager, not once per page" do
create_page_with_element
queries_for_one_page = count_element_load_queries do
get alchemy_json_api.pages_path(include: "all_elements.ingredients")
end
expect(queries_for_one_page).to be > 0

2.times { create_page_with_element }
queries_for_three_pages = count_element_load_queries do
get alchemy_json_api.pages_path(include: "all_elements.ingredients")
end

expect(queries_for_three_pages).to eq(queries_for_one_page)
end
end

context "with pagination params" do
before do
FactoryBot.create_list(:alchemy_page, 3, :public)
Expand Down
Loading