@@ -13,6 +13,7 @@ def reify(version, options)
1313 mark_for_destruction : false ,
1414 has_one : false ,
1515 has_many : false ,
16+ belongs_to : false ,
1617 unversioned_attributes : :nil
1718 )
1819
@@ -78,6 +79,10 @@ def reify(version, options)
7879 reify_has_ones version . transaction_id , model , options
7980 end
8081
82+ unless options [ :belongs_to ] == false
83+ reify_belongs_tos version . transaction_id , model , options
84+ end
85+
8186 unless options [ :has_many ] == false
8287 reify_has_manys version . transaction_id , model , options
8388 end
@@ -108,7 +113,7 @@ def prepare_array_for_has_many(array, options, versions)
108113 elsif version . event == "create"
109114 options [ :mark_for_destruction ] ? record . tap ( &:mark_for_destruction ) : nil
110115 else
111- version . reify ( options . merge ( has_many : false , has_one : false ) )
116+ version . reify ( options . merge ( has_many : false , has_one : false , belongs_to : false ) )
112117 end
113118 end
114119
@@ -117,7 +122,7 @@ def prepare_array_for_has_many(array, options, versions)
117122 # associations.
118123 array . concat (
119124 versions . values . map { |v |
120- v . reify ( options . merge ( has_many : false , has_one : false ) )
125+ v . reify ( options . merge ( has_many : false , has_one : false , belongs_to : false ) )
121126 }
122127 )
123128
@@ -150,7 +155,7 @@ def reify_has_ones(transaction_id, model, options = {})
150155 end
151156 end
152157 else
153- child = version . reify ( options . merge ( has_many : false , has_one : false ) )
158+ child = version . reify ( options . merge ( has_many : false , has_one : false , belongs_to : false ) )
154159 model . appear_as_new_record do
155160 without_persisting ( child ) do
156161 model . send "#{ assoc . name } =" , child
@@ -160,6 +165,32 @@ def reify_has_ones(transaction_id, model, options = {})
160165 end
161166 end
162167
168+ def reify_belongs_tos ( transaction_id , model , options = { } )
169+ associations = model . class . reflect_on_all_associations ( :belongs_to )
170+
171+ associations . each do |assoc |
172+ next unless assoc . klass . paper_trail_enabled_for_model?
173+ collection_key = model . send ( assoc . association_foreign_key )
174+
175+ version = assoc . klass . paper_trail_version_class .
176+ where ( "item_type = ?" , assoc . class_name ) .
177+ where ( "item_id = ?" , collection_key ) .
178+ where ( "created_at >= ? OR transaction_id = ?" , options [ :version_at ] , transaction_id ) .
179+ order ( "id" ) . limit ( 1 ) . first
180+
181+ collection = if version . nil?
182+ assoc . klass . where ( assoc . klass . primary_key => collection_key ) . first
183+ elsif version . event == "create"
184+ options [ :mark_for_destruction ] ? collection . mark_for_destruction : nil
185+ else
186+ version . reify ( options . merge ( has_many : false , has_one : false ,
187+ belongs_to : false ) )
188+ end
189+
190+ model . send ( "#{ assoc . name } =" . to_sym , collection )
191+ end
192+ end
193+
163194 # Restore the `model`'s has_many associations as they were at version_at
164195 # timestamp We lookup the first child versions after version_at timestamp or
165196 # in same transaction.
0 commit comments