目標: One Rails模型(表格)具有多個模型,它們從中繼承,每個模型定義自己的回形針has_attached_file
配置。使用STI的回形針的多個模型
我曾經有一個上傳類,我正在使用回形針。問題是,當我添加更多文件類型(pdf,word文檔等)時,它們仍然通過「style」和「convert_options」作爲圖像進行處理。此外,現在我需要在S3上存儲一些文件,而其他文件則存儲在本地。
也就是說,我已經重組了一些東西,例如我現在有一個S3File,Contract和其他所有從Upload繼承的模型,它們仍然繼承自ActiveRecord :: Base。
# app/models/project.rb
class Project < ActiveRecord::Base
has_many :contracts, :dependent => :destroy
accepts_nested_attributes_for :contracts, :allow_destroy => true
has_many :s3_files, :dependent => :destroy
accepts_nested_attributes_for :s3_files, :allow_destroy => true
# ...
end
# app/models/upload.rb
class Upload < ActiveRecord::Base
belongs_to :project
end
# app/models/contract.rb
class Contract < Upload
has_attached_file :item,
:url => "/projects/:project_id/uploads/:id/:basename.:extension",
:path => ":rails_root/public/:class/:attachment/:id/:basename.:extension"
do_not_validate_attachment_file_type :item
end
# app/models/s3_file.rb
class S3File < Upload
has_attached_file :s3file,
storage: :s3,
url: ':s3_domain_url',
path: lambda {|u| 'files/:basename.:extension' }
do_not_validate_attachment_file_type :s3file
end
現在,當我嘗試和查詢數據的控制檯,它返回上傳的對象,而不是S3File或合同。
irb(main):005:0> Project.first.contracts
=> #<Upload id: 14833, project_id: 9717, upload_type: "private", item_file_name: "abcd.pdf", item_category: "contracts", item_content_type: "application/pdf", item_file_size: 671367, rake_processed: 0, name: "", created_at: "2013-05-30 20:05:02", updated_at: "2013-05-30 20:05:02">
將響應作爲上傳類型有問題,因爲它沒有回形針附件。這些在子類上定義,每個子類都有一個唯一的url,路徑和存儲定義has_attached_file
。
我看到了multiple models and paperclip和polymorphic multiple models paperclip的問題,但在這些問題中,每個「多個模型」都從ActiveRecord :: Base繼承,我的目標是避免如果我可以,因爲數據結構是相同的。
我的這個問題是:
- 這對於具有文件類型與不同的存儲後端有一個表的正確方法?作爲文件,它們大多都具有相同的屬性,因此對於這些模型中的每一個都有多個表格似乎沒有必要。
- 我需要使用多態關聯嗎?我如何在這裏定義這些?我無法讓它工作,再加上它看起來不合適,因爲無論如何Contract和S3File都是Upload類型的,它們沒有自己的表格。
- 使用單獨的
has_attached_file
(:item或:s3file)名稱是否是一個好主意,還是使它們保持不變是有益的?