Skip to content

Instantly share code, notes, and snippets.

@harshalbhakta
Last active December 19, 2020 02:44
Show Gist options
  • Save harshalbhakta/7966524a6e1fe0261386c48ed0f18ec0 to your computer and use it in GitHub Desktop.
Save harshalbhakta/7966524a6e1fe0261386c48ed0f18ec0 to your computer and use it in GitHub Desktop.
Eager load polymorphic in Rails 6.0.0
D, [2020-12-19T08:12:50.286546 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.286771 #61072] DEBUG -- : User Create (0.1ms) INSERT INTO "users" ("name") VALUES (?) [["name", "First"]]
D, [2020-12-19T08:12:50.286964 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.287390 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.287502 #61072] DEBUG -- : User Create (0.0ms) INSERT INTO "users" ("name") VALUES (?) [["name", "Second"]]
D, [2020-12-19T08:12:50.287612 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.287852 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.287956 #61072] DEBUG -- : User Create (0.0ms) INSERT INTO "users" ("name") VALUES (?) [["name", "Third"]]
D, [2020-12-19T08:12:50.288063 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.290632 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.290755 #61072] DEBUG -- : Shop Create (0.1ms) INSERT INTO "shops" ("name", "shop_type") VALUES (?, ?) [["name", "First"], ["shop_type", "Small"]]
D, [2020-12-19T08:12:50.290874 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.291126 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.291241 #61072] DEBUG -- : Shop Create (0.0ms) INSERT INTO "shops" ("name", "shop_type") VALUES (?, ?) [["name", "Second"], ["shop_type", "Big"]]
D, [2020-12-19T08:12:50.291351 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.291598 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.291708 #61072] DEBUG -- : Shop Create (0.0ms) INSERT INTO "shops" ("name", "shop_type") VALUES (?, ?) [["name", "Third"], ["shop_type", "Small"]]
D, [2020-12-19T08:12:50.291815 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.298215 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.298376 #61072] DEBUG -- : Review Create (0.1ms) INSERT INTO "reviews" ("user_id", "reviewable_type", "reviewable_id") VALUES (?, ?, ?) [["user_id", 1], ["reviewable_type", "Shop"], ["reviewable_id", 1]]
D, [2020-12-19T08:12:50.298492 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.298930 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.299057 #61072] DEBUG -- : Review Create (0.1ms) INSERT INTO "reviews" ("user_id", "reviewable_type", "reviewable_id") VALUES (?, ?, ?) [["user_id", 1], ["reviewable_type", "Shop"], ["reviewable_id", 2]]
D, [2020-12-19T08:12:50.299158 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.299460 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.299584 #61072] DEBUG -- : Review Create (0.1ms) INSERT INTO "reviews" ("user_id", "reviewable_type", "reviewable_id") VALUES (?, ?, ?) [["user_id", 1], ["reviewable_type", "Shop"], ["reviewable_id", 3]]
D, [2020-12-19T08:12:50.299684 #61072] DEBUG -- : (0.0ms) commit transaction
D, [2020-12-19T08:12:50.299983 #61072] DEBUG -- : (0.0ms) begin transaction
D, [2020-12-19T08:12:50.300105 #61072] DEBUG -- : Review Create (0.1ms) INSERT INTO "reviews" ("user_id", "reviewable_type", "reviewable_id") VALUES (?, ?, ?) [["user_id", 2], ["reviewable_type", "Shop"], ["reviewable_id", 1]]
D, [2020-12-19T08:12:50.300203 #61072] DEBUG -- : (0.0ms) commit transaction
/Users/harshal/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activerecord-6.0.0/lib/active_record/relation/delegation.rb:115: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
/Users/harshal/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activerecord-6.0.0/lib/active_record/relation.rb:27: warning: The called method `initialize' is defined here
D, [2020-12-19T08:12:50.305281 #61072] DEBUG -- : (0.1ms) SELECT COUNT(DISTINCT "reviews"."id") FROM "reviews" LEFT OUTER JOIN "shops" ON "shops"."id" = "reviews"."reviewable_id" AND "reviews"."reviewable_type" = ? WHERE "shops"."shop_type" = ? [["reviewable_type", "Shop"], ["shop_type", "Small"]]
.
Finished in 0.022028s, 45.3968 runs/s, 45.3968 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
# frozen_string_literal: true
# https://stackoverflow.com/questions/16123492/eager-load-polymorphic
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
# Activate the gem you are reporting the issue against.
gem "rails", "6.0.0"
gem "sqlite3"
end
require "active_record"
require "minitest/autorun"
require "logger"
# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :users, force: true do |t|
t.string :name
end
create_table :shops, force: true do |t|
t.string :name
t.string :shop_type
end
create_table :reviews, force: true do |t|
t.references :user
t.references :reviewable, polymorphic: true
end
end
class User < ActiveRecord::Base
has_many :reviews
end
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
belongs_to :shop, -> { where(reviews: { reviewable_type: 'Shop' }) }, foreign_key: 'reviewable_id'
# Ensure review.shop returns nil unless review.reviewable_type == "Shop"
def shop
return unless reviewable_type == "Shop"
super
end
end
class Shop < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
class BugTest < Minitest::Test
def test_association_stuff
user1 = User.create! name: "First"
user2 = User.create! name: "Second"
user3 = User.create! name: "Third"
shop1 = Shop.create! name: "First", shop_type: "Small"
shop2 = Shop.create! name: "Second", shop_type: "Big"
shop3 = Shop.create! name: "Third", shop_type: "Small"
Review.create! user: user1, reviewable: shop1
Review.create! user: user1, reviewable: shop2
Review.create! user: user1, reviewable: shop3
Review.create! user: user2, reviewable: shop1
reviews = Review.includes(:shop).where(shops: {shop_type: 'Small'})
assert_equal reviews.count, 3
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment