Realized we could get rid of the need to use the explicit table_map option to CTI w/ a qualified dataset *if we can assume that the subclasses are qualified the same way as the superclass*. It seems like a more reasonable default assumption than that they are not using the same qualifier, and can still use the table_map to get around it if needed.
I wasn't sure if this was the best way to get the superclass' qualifier, but the following patch adds a spec and passes: If it looks good and my assumption makes sense I'll submit a PR or make changes. diff --git a/lib/sequel/plugins/class_table_inheritance.rb b/lib/sequel/plugins/class_table_inheritance.rb index 214f50bb7..27b9be1c4 100644 --- a/lib/sequel/plugins/class_table_inheritance.rb +++ b/lib/sequel/plugins/class_table_inheritance.rb @@ -272,7 +272,11 @@ module Sequel if table = cti_table_map[n.to_sym] columns = db.from(table).columns else - table = subclass.implicit_table_name + table = if table_name.is_a?(SQL::QualifiedIdentifier) && schema = dataset.schema_and_table(table_name).first + SQL::QualifiedIdentifier.new schema, subclass.implicit_table_name + else + subclass.implicit_table_name + end columns = check_non_connection_error(false){db.from(table).columns} table = nil if !columns || columns.empty? end diff --git a/spec/extensions/class_table_inheritance_spec.rb b/spec/extensions/class_table_inheritance_spec.rb index d7fa347ac..3677cd53b 100644 --- a/spec/extensions/class_table_inheritance_spec.rb +++ b/spec/extensions/class_table_inheritance_spec.rb @@ -594,7 +594,7 @@ describe "class_table_inheritance plugin with dataset defined with QualifiedIden def self.columns dataset.columns || dataset.opts[:from].first.expression.columns end - plugin :class_table_inheritance, key: :type, :table_map=>{:Manager=>Sequel[:hr][:managers], :Staff=>Sequel[:hr][:staff]} + plugin :class_table_inheritance, :table_map=>{:Staff=>Sequel[:hr][:staff]} end class ::Manager < Employee one_to_many :staff_members, :class=>:Staff @@ -609,6 +609,12 @@ describe "class_table_inheritance plugin with dataset defined with QualifiedIden [:Manager, :Staff, :Employee].each{|s| Object.send(:remove_const, s)} end + it "should use a subquery with the same qualifier in subclasses" do + Employee.dataset.sql.must_equal 'SELECT * FROM hr.employees' + Manager.dataset.sql.must_equal 'SELECT * FROM (SELECT hr.employees.id, hr.employees.name, hr.employees.kind FROM hr.employees INNER JOIN hr.managers ON (hr.managers.id = hr.employees.id)) AS employees' + Staff.dataset.sql.must_equal 'SELECT * FROM (SELECT hr.employees.id, hr.employees.name, hr.employees.kind, hr.staff.manager_id FROM hr.employees INNER JOIN hr.staff ON (hr.staff.id = hr.employees.id)) AS employees' + end + it "should handle many_to_one relationships correctly" do Manager.dataset = Manager.dataset.with_fetch(:id=>3, :name=>'E') Staff.load(:manager_id=>3).manager.must_equal Manager.load(:id=>3, :name=>'E') -- You received this message because you are subscribed to the Google Groups "sequel-talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to sequel-talk+unsubscr...@googlegroups.com. To post to this group, send email to sequel-talk@googlegroups.com. Visit this group at https://groups.google.com/group/sequel-talk. For more options, visit https://groups.google.com/d/optout.