diff options
author | Abhishek Chandrasekhar <me@abhchand.me> | 2019-02-20 23:37:10 -0500 |
---|---|---|
committer | Abhishek Chandrasekhar <me@abhchand.me> | 2019-02-26 11:10:38 -0500 |
commit | 32438ed64fea7dbe52ea0898be3d4276e63baa78 (patch) | |
tree | 991616c425edbb3035c046037babe2a80315bab4 /actioncable/test/channel | |
parent | 67732efcb658807929be0e968642ee1d90b3c986 (diff) | |
download | rails-32438ed64fea7dbe52ea0898be3d4276e63baa78.tar.gz rails-32438ed64fea7dbe52ea0898be3d4276e63baa78.tar.bz2 rails-32438ed64fea7dbe52ea0898be3d4276e63baa78.zip |
[ActiveStorage] Ensure that the `_blob` association is properly loaded when attaching `::One`
Consider a model with `One` and `Many` attachments configured:
class User < ActiveRecord::Base
has_one_attached :avatar
has_many_attached :highlights
end
=== One Attachment
After attaching `One` attachment (`:avatar`), we can see that the associated
`_blob` record (`:avatar_blob`) still returns as `nil`.
user.avatar.attach(blob)
user.avatar_attachment.present? => true
user.avatar_blob.present? => false # Incorrect!
This is a false negative. It happens because after the attachment and blob
are built:
1. The record already has its `_blob` association loaded, as `nil`
2. the `::Attachment` is associated with the record but the `::Blob` only gets
associated with the `::Attachment`, not the record itself
In reality, the blob does in fact exist. We can verify this as follows:
user.avatar.attach(blob)
user.avatar_attachment.blob.present? => true # Blob does exist!
The fix in this change is to simply assign the `::Blob` when assigning
the `::Attachment`. After this fix is applied, we correctly observe:
user.avatar.attach(blob)
user.avatar_attachment.present? => true
user.avatar_blob.present? => true # Woohoo!
=== Many Attachments
We don't see this issue with `Many` attachments because the `_blob` association
is already loaded as part of attaching more/newer blobs.
user.highlights.attach(blob)
user.highlights_attachments.any? => true
user.highlights_blobs.any? => true
Diffstat (limited to 'actioncable/test/channel')
0 files changed, 0 insertions, 0 deletions