Skip to content

Instantly share code, notes, and snippets.

@wconrad
Last active August 29, 2015 14:15
Show Gist options
  • Save wconrad/d5d3ca522ac3c06e62fe to your computer and use it in GitHub Desktop.
Save wconrad/d5d3ca522ac3c06e62fe to your computer and use it in GitHub Desktop.
Composite_primary_key issue: extra query when part of primary key not selected
gem "composite_primary_keys", "7.0.13"
gem 'activerecord', '4.1.9'
gem 'sqlite3'
require "composite_primary_keys"
require 'active_record'
require 'logger'
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Base.logger = Logger.new(STDOUT)
# Schema
ActiveRecord::Schema.define do
create_table "org", id: false, force: true do |t|
t.integer "n"
t.string "or_customer"
t.string "or_rcc_code"
t.integer "or_acct_mgr", precision: 38, scale: 0
end
create_table "salesman_names", id: false, force: true do |t|
t.string "sm_code"
end
end
# Models
class Org < ActiveRecord::Base
self.table_name = "org"
self.primary_key = [:or_customer, :or_rcc_code]
belongs_to :account_manager_1,
'class_name': :SalesmanName,
foreign_key: :or_acct_mgr,
primary_key: :sm_code
end
class SalesmanName < ActiveRecord::Base
self.table_name = "salesman_names"
self.primary_key = :sm_code
end
# Data
Org.create!([
{n: 17, or_customer: "MEG", or_rcc_code: "ABC", or_acct_mgr: 204},
{n: 18, or_customer: "MEG", or_rcc_code: "DEF", or_acct_mgr: 204},
])
SalesmanName.create!([
{sm_code: 105},
{sm_code: 204},
])
# Tests
puts
puts "----- Runnning"
puts
orgs = Org.
select(:or_customer).
select(:or_acct_mgr).
includes(:account_manager_1).
order(:n)
orgs.each do |org|
puts "Loading relation for #{org.attributes.inspect}:"
org.account_manager_1
end
puts
puts "----- Control experiment"
puts
orgs = Org.
select(:or_customer).
select(:or_rcc_code). # Select added
select(:or_acct_mgr).
includes(:account_manager_1).
order(:n)
orgs.each do |org|
puts "Loading relation for #{org.attributes.inspect}:"
org.account_manager_1
end
-- create_table("org", {:id=>false, :force=>true})
D, [2015-02-08T09:04:15.323113 #20034] DEBUG -- : (0.2ms) CREATE TABLE "org" ("n" integer, "or_customer" varchar(255), "or_rcc_code" varchar(255), "or_acct_mgr" integer)
-> 0.0038s
-- create_table("salesman_names", {:id=>false, :force=>true})
D, [2015-02-08T09:04:15.323531 #20034] DEBUG -- : (0.1ms) CREATE TABLE "salesman_names" ("sm_code" varchar(255))
-> 0.0003s
D, [2015-02-08T09:04:15.329218 #20034] DEBUG -- : (0.0ms) begin transaction
D, [2015-02-08T09:04:15.332193 #20034] DEBUG -- : SQL (0.1ms) INSERT INTO "org" ("n", "or_acct_mgr", "or_customer", "or_rcc_code") VALUES (?, ?, ?, ?) [["n", 17], ["or_acct_mgr", 204], ["or_customer", "MEG"], ["or_rcc_code", "ABC"]]
D, [2015-02-08T09:04:15.332355 #20034] DEBUG -- : (0.0ms) commit transaction
D, [2015-02-08T09:04:15.332567 #20034] DEBUG -- : (0.0ms) begin transaction
D, [2015-02-08T09:04:15.333002 #20034] DEBUG -- : SQL (0.0ms) INSERT INTO "org" ("n", "or_acct_mgr", "or_customer", "or_rcc_code") VALUES (?, ?, ?, ?) [["n", 18], ["or_acct_mgr", 204], ["or_customer", "MEG"], ["or_rcc_code", "DEF"]]
D, [2015-02-08T09:04:15.333131 #20034] DEBUG -- : (0.0ms) commit transaction
D, [2015-02-08T09:04:15.333976 #20034] DEBUG -- : (0.0ms) begin transaction
D, [2015-02-08T09:04:15.334424 #20034] DEBUG -- : SQL (0.1ms) INSERT INTO "salesman_names" ("sm_code") VALUES (?) [["sm_code", 105]]
D, [2015-02-08T09:04:15.334537 #20034] DEBUG -- : (0.0ms) commit transaction
D, [2015-02-08T09:04:15.334686 #20034] DEBUG -- : (0.0ms) begin transaction
D, [2015-02-08T09:04:15.334948 #20034] DEBUG -- : SQL (0.0ms) INSERT INTO "salesman_names" ("sm_code") VALUES (?) [["sm_code", 204]]
D, [2015-02-08T09:04:15.335072 #20034] DEBUG -- : (0.0ms) commit transaction
----- Runnning
D, [2015-02-08T09:04:15.335697 #20034] DEBUG -- : Org Load (0.1ms) SELECT "org"."or_customer", "org"."or_acct_mgr" FROM "org" ORDER BY "org"."n" ASC
D, [2015-02-08T09:04:15.337532 #20034] DEBUG -- : SalesmanName Load (0.1ms) SELECT "salesman_names".* FROM "salesman_names" WHERE "salesman_names"."sm_code" IN (204)
Loading relation for {"or_customer"=>"MEG", "or_acct_mgr"=>204}:
Loading relation for {"or_customer"=>"MEG", "or_acct_mgr"=>204}:
D, [2015-02-08T09:04:15.338680 #20034] DEBUG -- : SalesmanName Load (0.1ms) SELECT "salesman_names".* FROM "salesman_names" WHERE "salesman_names"."sm_code" = 204 LIMIT 1
----- Control experiment
D, [2015-02-08T09:04:15.339150 #20034] DEBUG -- : Org Load (0.1ms) SELECT "org"."or_customer", "org"."or_rcc_code", "org"."or_acct_mgr" FROM "org" ORDER BY "org"."n" ASC
D, [2015-02-08T09:04:15.339724 #20034] DEBUG -- : SalesmanName Load (0.1ms) SELECT "salesman_names".* FROM "salesman_names" WHERE "salesman_names"."sm_code" IN (204)
Loading relation for {"or_customer"=>"MEG", "or_rcc_code"=>"ABC", "or_acct_mgr"=>204}:
Loading relation for {"or_customer"=>"MEG", "or_rcc_code"=>"DEF", "or_acct_mgr"=>204}:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment