我对 Ruby on Rails 一无所知,但我不久前正在重写别人用它开发的应用程序。我可以访问源代码,虽然我喜欢认为我了解编程(C/C++ 等),但我在尝试理解 Ruby on Rails 时遇到了困难。我想我无法弄清楚的原因是因为它的细节隐藏在一个库中(paperclip)。
(简短版本:我想将数据库列中的文件名与磁盘上文件的物理位置相匹配。)
以我有限的知识,我知道以下...
应用程序有一个
Gemfile.gem
,其中包含以下条目:“回形针”、“4.3.0”。我查看了paperclip
的开发历史,意识到这是从2016年4月开始的。所以,它看起来很老了......
我有一个 PostgreSQL 数据库,其中包含以下字段:
所有这些都与文档中here提到的变量相匹配。
数据库中
attachment_file_name
下的值只是文件名,没有路径。
在磁盘上,文件存储在
attachments/000/003/335/original/abc.txt
等目录中,这看起来与文档中的示例完全相同。所以,我想我相当确定 paperclip
正在被使用。
文件名如何转换为上述路径?
而且,更重要的是,如果我有一组数百个文件,我想打印出每个文件的完整路径。文件名重复导致路径不同。所以我猜计算(哈希函数?)是使用文件名和文件内容完成的。
有人可以提供有关如何执行此操作和/或我应该在代码中查找什么内容的建议吗?
我想我的问题与存储库中的这个Issue类似,它将该问题的作者指向了StackOverflow(当然,那是7年前的事了)。
谢谢!任何帮助将不胜感激!
举个例子就更容易了:
class User < ActiveRecord::Base
has_attached_file :attachment
validates_attachment_content_type :attachment, content_type: /\Aimage\/.*\z/
end
附上文件:
>> User.create!(attachment: File.open("avatar.png"))
TRANSACTION (0.1ms) begin transaction
User Create (0.3ms) INSERT INTO "users" ("attachment_file_name", "attachment_content_type", "attachment_file_size", "attachment_updated_at") VALUES (?, ?, ?, ?) [["attachment_file_name", "avatar.png"], ["attachment_content_type", "image/png"], ["attachment_file_size", 8229], ["attachment_updated_at", "2023-12-01 05:14:12.369915"]]
TRANSACTION (5.4ms) commit transaction
=> #<User id: 1, attachment_file_name: "avatar.png", attachment_content_type: "image/png", attachment_file_size: 8229, attachment_updated_at: "2023-12-01 05:14:12.369915603 +0000">
这是存储文件的默认路径:
>> Paperclip::Attachment.default_options[:url]
=> "/system/:class/:attachment/:id_partition/:style/:filename"
$ ls public/system/**/*.png
public/system/users/attachments/000/000/001/original/avatar.png
public/
system/
users/ - :class # `User.name.underscore.pluralize`
# https://github.com/thoughtbot/paperclip/blob/main/lib/paperclip/interpolations.rb#L88
attachments/ - :attachment # pluralized attachment name
# vvvvvvvvvv
# `has_attached_file :attachment`
# https://github.com/thoughtbot/paperclip/blob/main/lib/paperclip/interpolations.rb#L191
000/000/001/ - :id_partition # id padded with zeros and split in 3 groups (9 digits total)
# https://github.com/thoughtbot/paperclip/blob/main/lib/paperclip/interpolations.rb#L174
original/ - :style # "original" is default, this is what you've uploaded
# https://github.com/thoughtbot/paperclip/blob/main/lib/paperclip/interpolations.rb#L197
avatar.png - :filename
如果你只能从数据库端工作
sqlite> select * from users;
+----+----------------------+-------------------------+----------------------+----------------------------+
| id | attachment_file_name | attachment_content_type | attachment_file_size | attachment_updated_at |
+----+----------------------+-------------------------+----------------------+----------------------------+
| 1 | avatar.png | image/png | 8229 | 2023-12-01 05:14:12.369915 |
+----+----------------------+-------------------------+----------------------+----------------------------+
public/
system/
users/ - :class # most likely the same as table name
attachments/ - :attachment # attachment_file_name
# ^^^^^^^^^^s
000/000/001/ - :id_partition # padded id - you'll need to work that one out
original/ - :style # "original" - this is not in the db
avatar.png - :filename # attachment_file_name