使用 Ruby on Rails 的回形针将文件名映射到路径

问题描述 投票:0回答:1

我对 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年前的事了)。

谢谢!任何帮助将不胜感激!

ruby-on-rails paperclip
1个回答
0
投票

举个例子就更容易了:

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
© www.soinside.com 2019 - 2024. All rights reserved.