-
Notifications
You must be signed in to change notification settings - Fork 911
Description
It appears as though if Single Table Inheritance is being used on an association, if you try to reify with has_many: true or has_one: true, it will not find and build the previous version of the association and instead always use the current version of the association when browsing previous versions.
I believe this is happening because if STI is used, the item_type is always stored as the base class. But when calling the method reify_has_many_directly, it is using the main class of the association. This builds a WHERE clause that is looking for the wrong value in the item_type column.
ex:
class Document < ActiveRecord::Base
has_paper_trail
has_one :authorship
end
class Assignment < ActiveRecord::Base
belongs_to :document
end
class Authorship < Assignment
has_paper_trail
end
@document.reify(has_many: true, has_one: true)
The last line there will produce a SQL query like this:
SELECT `versions`.* FROM `versions`
INNER JOIN `version_associations` ON `version_associations`.`version_id` = `versions`.`id`
WHERE (version_associations.foreign_key_name = 'document_id')
AND (version_associations.foreign_key_id = 1)
AND (versions.item_type = 'Authorship')
AND (created_at >= '2015-08-26 20:07:28.000000' OR transaction_id = 933)
ORDER BY versions.id ASC LIMIT 1
But item_type will never be 'Authorship', it is always stored as Assignment. I'm still working on figuring out a solution to this if I can, but this seems to be what is happening from my understanding.
Modifying the database manually and changing the item_type column from Assignment to Authorship results in being able to view the correct versions of the association as I browse through the document history.