Last active
December 19, 2020 02:44
-
-
Save harshalbhakta/7966524a6e1fe0261386c48ed0f18ec0 to your computer and use it in GitHub Desktop.
Eager load polymorphic in Rails 6.0.0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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