-
Notifications
You must be signed in to change notification settings - Fork 83
Associations versioning
Vladimir Dementyev edited this page Jan 16, 2018
·
2 revisions
Logidze has a feature of associations versioning. The best way to explain it is by the example:
class Post < ActiveRecord::Base
has_many :comments
has_logidze
end
class Comment < ActiveRecord::Base
belongs_to :post
has_logidze
end
# 2017-01-19
post = Post.create!(post_params)
# 2017-01-22
comment = post.comments.create(body: 'My comment')
# 2017-01-24
comment.update!(body: 'New text')
# at this time comment wasn't updated yet...
old_post = post.at('2017-01-23')
# ...so we see its original body, although post itself wasn't changed
old_post.comments.first.body #=> 'My comment'
# at this time post didn't have comments at all
very_old_post = post.at(time: '2017-01-20')
very_old_post.comments.length #=> 0This feature is considered experimental, so it's disabled by default. You can turn it on by setting Logidze.associations_versioning to true. Associations versioning works with belongs_to and has_many associations.
- You could notice the usage of the
lengthmethod instead of thesizein the example above. Because ActiveRecord fires SQL COUNT request in thesize, if association wasn't loaded in memory, it bypasses logidze, and returns a not versioned result. Thelength, in turn, always loads association at first, so we can apply versioning here - The
empty?,any?,many?,blank?methods will always load association in memory. So thecollection_idsdoes too - Persisting methods, such as
update_all,collection_ids=and etc., are left as they are, so they will change current associations records in the database, no history changing -
at!method doesn't take into account associations