Hey Jeremy, Thanks for the reply.
As you rightly pointed out, I'm currently using Sequel version 4.45.0 and not Sequel 5. So I guess, upgrading the sequel gem would resolve this issue. On Tuesday, November 27, 2018 at 8:39:40 PM UTC+5:30, Jeremy Evans wrote: > > On Tuesday, November 27, 2018 at 6:55:35 AM UTC-8, Sachu Thomas Isaac > wrote: >> >> Hi, >> >> Following are the 3 classes in which one class is of class table >> inheritance >> >> class User < Sequel::Model >> #table_name :users >> plugin :class_table_inheritance, key: :type >> end >> >> class Employee < User >> #table_name :employees >> many_to_one :department >> end >> >> class Department < Sequel::Model >> one_to_many :employees >> end >> >> >> @department.remove_employee(@employee) fails as it throws *an exception >> stating that :id is ambiguous* >> >> The exact line which causes this problem is the call to :*pk_hash* >> instead of :*qualified_pk_hash* >> >> >> https://github.com/jeremyevans/sequel/blob/588c5c65350b7f5aa82b6eb9e7115eaa6f51d8fb/lib/sequel/model/associations.rb#L2535 >> >> The same can be replicated as below: >> >> Employee.dataset.where(@employee.pk_hash) throws the exception for :id >> being ambiguous >> >> Is there any reason why pk_hash is used in Dataset#where query instead of >> :qualified_pk_hash? I've overridden (patch work) the pk_hash method to >> return the qualified_pk_hash to make it work. >> > > Which version of Sequel are you using? Sequel 5 shouldn't have these > issues as all model classes that use joined datasets wrap the dataset in a > subquery. Here's a self contained example that shows correct behavior when > used on the master branch: > > DB.create_table! :users do > primary_key :id > Integer :department_id > String :name > String :type > end > > DB.create_table! :employees do > primary_key :id > String :position > end > > DB.create_table! :departments do > primary_key :id > String :name > end > > class User < Sequel::Model > plugin :class_table_inheritance, key: :type > end > > class Employee < User > many_to_one :department > end > > class Department < Sequel::Model > one_to_many :employees > end > > d = Department.create(:name=>'c') > e = Employee.create(:name=>'a', :position=>'b', :department=>d) > p d.employees > d.remove_employee(e) > p d.employees(:reload=>true) > p Employee.dataset.where(e.pk_hash).all > > SQL queries used for the remove_employee call are: > > UPDATE "users" SET "department_id" = NULL, "name" = 'a', "type" = > 'Employee' WHERE ("id" = 1) > UPDATE "employees" SET "position" = 'b' WHERE ("id" = 1) > > SQL query used for the direct pk_hash usage is: > > SELECT * FROM (SELECT "users"."id", "users"."department_id", > "users"."name", "users"."type", "employees"."position" FROM "users" INNER > JOIN "employees" ON ("employees"."id" = "users"."id")) AS "users" WHERE > ("id" = 1) > > Thanks, > Jeremy > -- 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sequel-talk. For more options, visit https://groups.google.com/d/optout.
