未验证 提交 5963766d 编写于 作者: D David Heinemeier Hansson 提交者: Kasper Timm Hansen

Explore regular polymorphic associations rather than record_gid

上级 4efbeaea
......@@ -6,19 +6,11 @@
class ActiveStorage::Attachment < ActiveRecord::Base
self.table_name = "active_storage_attachments"
belongs_to :record, polymorphic: true
belongs_to :blob, class_name: "ActiveStorage::Blob"
delegate_missing_to :blob
def record
@record ||= GlobalID::Locator.locate(record_gid)
end
def record=(record)
@record = record
self.record_gid = record&.to_gid
end
def purge
blob.purge
destroy
......
......@@ -16,6 +16,9 @@ def has_one_attached(name, dependent: :purge_later)
instance_variable_set("@active_storage_attached_#{name}", ActiveStorage::Attached::One.new(name, self))
end
has_one :"#{name}_attachment", -> { where(name: name) }, class_name: "ActiveStorage::Attachment", as: :record
has_one :"#{name}_blob", through: :"#{name}_attachment"
if dependent == :purge_later
before_destroy { public_send(name).purge_later }
end
......@@ -38,6 +41,9 @@ def has_many_attached(name, dependent: :purge_later)
instance_variable_set("@active_storage_attached_#{name}", ActiveStorage::Attached::Many.new(name, self))
end
has_many :"#{name}_attachments", -> { where(name: name) }, as: :record, class_name: "ActiveStorage::Attachment"
has_many :"#{name}_blobs", through: :"#{name}_attachments"
if dependent == :purge_later
before_destroy { public_send(name).purge_later }
end
......
......@@ -7,14 +7,14 @@ class ActiveStorage::Attached::Many < ActiveStorage::Attached
# You don't have to call this method to access the attachments' methods as
# they are all available at the model level.
def attachments
@attachments ||= ActiveStorage::Attachment.where(record_gid: record.to_gid.to_s, name: name)
@attachments ||= record.public_send("#{name}_attachments")
end
# Associates one or several attachments with the current record, saving
# them to the database.
def attach(*attachables)
@attachments = attachments | Array(attachables).flatten.collect do |attachable|
ActiveStorage::Attachment.create!(record_gid: record.to_gid.to_s, name: name, blob: create_blob_from(attachable))
ActiveStorage::Attachment.create!(record: record, name: name, blob: create_blob_from(attachable))
end
end
......
......@@ -7,13 +7,13 @@ class ActiveStorage::Attached::One < ActiveStorage::Attached
# You don't have to call this method to access the attachment's methods as
# they are all available at the model level.
def attachment
@attachment ||= ActiveStorage::Attachment.find_by(record_gid: record.to_gid.to_s, name: name)
@attachment ||= record.public_send("#{name}_attachment")
end
# Associates a given attachment with the current record, saving it to the
# database.
def attach(attachable)
@attachment = ActiveStorage::Attachment.create!(record_gid: record.to_gid.to_s, name: name, blob: create_blob_from(attachable))
@attachment = ActiveStorage::Attachment.create!(record: record, name: name, blob: create_blob_from(attachable))
end
# Checks the presence of the attachment.
......
......@@ -14,15 +14,16 @@ def change
create_table :active_storage_attachments do |t|
t.string :name
t.string :record_gid
t.string :record_type
t.integer :record_id
t.integer :blob_id
t.datetime :created_at
t.index :record_gid
t.index :blob_id
t.index [ :record_gid, :name ]
t.index [ :record_gid, :blob_id ], unique: true
t.index [ :record_type, :record_id ]
t.index [ :record_type, :record_id, :name ], name: "index_active_storage_attachments_record_and_name"
t.index [ :record_type, :record_id, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
end
end
end
......@@ -68,6 +68,14 @@ class ActiveStorage::AttachmentsTest < ActiveSupport::TestCase
assert_equal "country.jpg", @user.highlights.second.filename.to_s
end
test "find attached blobs" do
@user.highlights.attach(
{ io: StringIO.new("STUFF"), filename: "town.jpg", content_type: "image/jpg" },
{ io: StringIO.new("IT"), filename: "country.jpg", content_type: "image/jpg" })
User.where(id: @user.id).includes(highlights_attachments: :blob).first
end
test "purge attached blobs" do
@user.highlights.attach create_blob(filename: "funky.jpg"), create_blob(filename: "wonky.jpg")
highlight_keys = @user.highlights.collect(&:key)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册