Permalink
Browse files

Merge pull request #30629 from yhirano55/add_scope_to_has_one_attache…

…d_macro

Add `with_attached_*` scope to `has_one_attached` macro
  • Loading branch information...
eileencodes committed Sep 20, 2017
2 parents 057de4f + 704bf9b commit e7f39af3fafbb83e93b3bb58a03aefbf10752f41
@@ -12,6 +12,10 @@ module Attached::Macros
# There is no column defined on the model side, Active Storage takes
# care of the mapping between your records and the attachment.
#
# To avoid N+1 queries, you can include the attached blobs in your query like so:
#
# User.with_attached_avatar
#
# Under the covers, this relationship is implemented as a +has_one+ association to a
# ActiveStorage::Attachment record and a +has_one-through+ association to a
# ActiveStorage::Blob record. These associations are available as +avatar_attachment+
@@ -33,6 +37,8 @@ def #{name}
has_one :"#{name}_attachment", -> { where(name: name) }, class_name: "ActiveStorage::Attachment", as: :record
has_one :"#{name}_blob", through: :"#{name}_attachment", class_name: "ActiveStorage::Blob", source: :blob
scope :"with_attached_#{name}", -> { includes("#{name}_attachment": :blob) }
if dependent == :purge_later
before_destroy { public_send(name).purge_later }
end
@@ -84,6 +84,19 @@ class ActiveStorage::AttachmentsTest < ActiveSupport::TestCase
end
end
test "find with attached blob" do
records = %w[alice bob].map do |name|
User.create!(name: name).tap do |user|
user.avatar.attach create_blob(filename: "#{name}.jpg")
end
end
users = User.where(id: records.map(&:id)).with_attached_avatar.all
assert_equal "alice.jpg", users.first.avatar.filename.to_s
assert_equal "bob.jpg", users.second.avatar.filename.to_s
end
test "attach existing blobs" do
@user.highlights.attach create_blob(filename: "funky.jpg"), create_blob(filename: "wonky.jpg")

0 comments on commit e7f39af

Please sign in to comment.