我们的应用程序使用uuid作为主键,在PostgreSQL数据库上。(标准设置描述为here)。
我们按照here描述的过程集成了ActiveStorage。使用rails active_storage:install
的标准设置,并使用rails db:migrate
进行迁移。
我们有一个模型和相应的控制器如下:
# Model
class Message < ApplicationRecord
has_one_attached :image
def filename
image&.attachment&.blob&.filename
end
end
# Controller
class MessagesController < ApplicationController
def create
message = Message.create!(message_params)
redirect_to message
end
private
def message_params
params.require(:message).permit(:title, :content, :image)
end
end
我们观察到,前几组图像与模型示例正确关联,但随后我们使用模型示例获得随机图像,或者根本没有图像。每次,我们重新启动服务器,我们得到了前几张正确的图像,但后来它是不可预测的。
不确定出了什么问题,我们在rails控制台中进行了调试:
params[:image]
=> #<ActionDispatch::Http::UploadedFile:0x007fcf2fa97b70 @tempfile=#<Tempfile:/var/folders/dt/05ncjr6s52ggc4bk6fs521qw0000gn/T/RackMultipart20180726-8503-vg36kz.pdf>, @original_filename="sample.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"sample.pdf\"\r\nContent-Type: application/pdf\r\n">
在保存示例并检索文件名时,我们得到了一个随机文件,我们之前上传了。
@message = Message.new(message_params)
@message.filename
=> #<ActiveStorage::Filename:0x007fcf32cfd9e8 @filename="sample.pdf">
@message.save
@message.filename
=> #<ActiveStorage::Filename:0x007f82f2ad4ef0 @filename="OtherSamplePdf.pdf">
寻找这种奇怪行为的解释,以及可能的解决方案。
3条答案
按热度按时间erhoui1w1#
在activestorage source code中逐行查看并运行相同的命令数小时后,
一次又一次我们一次又一次地得到同样的随机结果。然后,我们查看了在将图像附加到消息时打印的日志轨道,并观察到以下情况:
record_id
被设置为534736
,而不是UUID。我们错在这里。**Active storage在我们的Message模型中需要整数外键,我们希望它使用uuids。**所以我们必须修复我们的迁移,使用uuids而不是整数外键。
解决方案:
希望这对面临类似问题的人有所帮助。干杯!
jei2mxaa2#
我在2020年的聚会上迟到了,但正如anurag所提到的,这是由于
active_storage_attachments
DB表使用了record_id
的bigint。我无法将所有带有ActiveStorage附件的模型迁移到UUID,所以我需要一种同时支持UUID和bigint的方法。警告:如果你能避免这种情况(最有可能的方法是将所有东西都迁移到UUID),那么我强烈建议你这样做,我计划一有时间就这么做。
除了警告之外,迁移active_storage_attachments表以将record_id列更改为
text
确实有效。我不得不调整我们应用程序中的几个位置,我们使用record_id
将值转换为连接中的文本。例如,我在加入一个具有UUID ID的模型时使用了以下代码。希望这可以帮助那些陷入困境的人,因为并非所有使用模型的ActiveStorage都使用UUID或bigint ID。
daupos2t3#
我也有这个问题。我的模型都使用UUID。由于
ActiveStorage
中没有需要保留的记录,我删除并重新创建了:active_storage_attachments
和:active_storage_blobs
表。这是我的迁移,如果它对任何人都有用。使用Rails 6.0.4。