Report abuse

Active record is getting confused about my polymorphic self-referential has_many :through, with a renamed non-polymorphic column.

Here's the relevant parts of the join table, named changeable_things_changers:

>> ChangeableThingsChanger.reflect_on_all_associations[1]
=> #"Person", :foreign_key=>"changeable_thing_id"}, @class_name="Person", @macro=:belongs_to, @primary_key_name="changeable_thing_id", @active_record=ChangeableThingsChanger, @name=:person>

>> ChangeableThingsChanger.reflect_on_all_associations[3]
=> #"changeable_thing_type", :polymorphic=>true}, @class_name="ChangeableThing", @macro=:belongs_to, @primary_key_name="changeable_thing_id", @active_record=ChangeableThingsChanger, @through_reflection=false, @name=:changeable_thing>

>> ChangeableThingsChanger.reflect_on_all_associations[7]
=> #"Person", :foreign_key=>"changer_id"}, @class_name="Person", @macro=:belongs_to, @primary_key_name="changer_id", @active_record=ChangeableThingsChanger, @name=:changer>
>> 

Here's the SQL which activerecord is generating. The double quoted condition is inserted explictly by me in the association, while the single quoted one (which is wrong) is coming from activerecord somewhere.

 Person Load (0.000000)   Mysql::Error: Unknown column 'changeable_things_changers.changer_type' in 'where clause': SELECT people.* FROM people INNER JOIN changeable_things_changers ON people.id = changeable_things_changers.changeable_thing_id WHERE (changeable_things_changers.changer_id = 6 AND changeable_things_changers.changer_type = 'Person' AND ((changeable_things_changers.changeable_thing_type = "Person"))) 


Notice the changer_type, which should not exist. There is no polymorphic changer belongs_to in the join model.

Here are the relevant associations from the Person model, sorry that they are barely readable:

?> Person.reflect_on_all_associations[29]
=> #:changer, :source=>:person, :through=>:changeable_things_changers, :class_name=>"Person", :conditions=>"changeable_things_changers.changeable_thing_type = \"Person\"", :foreign_key=>"changer_id"}, @table_name="people", @class_name="Person", @source_reflection=#"Person", :foreign_key=>"changeable_thing_id"}, @class_name="Person", @macro=:belongs_to, @primary_key_name="changeable_thing_id", @active_record=ChangeableThingsChanger, @name=:person>, @klass=Person, @macro=:has_many, @primary_key_name="changer_id", @active_record=Person, @through_reflection=#:changer, :foreign_key=>"changer_id"}, @table_name="changeable_things_changers", @class_name="ChangeableThingsChanger", @klass=ChangeableThingsChanger, @macro=:has_many, @primary_key_name="changer_id", @active_record=Person, @through_reflection=false, @name=:changeable_things_changers>, @name=:changeable_things_people, @source_reflection_names=[:person]>

>> Person.reflect_on_all_associations[31]
=> #:changer, :foreign_key=>"changer_id"}, @table_name="changeable_things_changers", @class_name="ChangeableThingsChanger", @klass=ChangeableThingsChanger, @macro=:has_many, @primary_key_name="changer_id", @active_record=Person, @through_reflection=false, @name=:changeable_things_changers>

I am trying to do:
Person.find(:first).changeable_things_people

and get the above wrong column problem.