2016-03-15 36 views
4

目標: 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 paperclippolymorphic multiple models paperclip的問題,但在這些問題中,每個「多個模型」都從ActiveRecord :: Base繼承,我的目標是避免如果我可以,因爲數據結構是相同的。

我的這個問題是:

  • 這對於具有文件類型與不同的存儲後端有一個表的正確方法?作爲文件,它們大多都具有相同的屬性,因此對於這些模型中的每一個都有多個表格似乎沒有必要。
  • 我需要使用多態關聯嗎?我如何在這裏定義這些?我無法讓它工作,再加上它看起來不合適,因爲無論如何Contract和S3File都是Upload類型的,它們沒有自己的表格。
  • 使用單獨的has_attached_file(:item或:s3file)名稱是否是一個好主意,還是使它們保持不變是有益的?

回答

2

STI與回形針已經在幾個問題#293#601#605進行了討論,並紙夾的支持功能現在。

STI是正確的方法嗎?

這對我來說是正確的方法,因爲我不想爲每個模型使用多個表格。爲了解決在查詢project.contracts和獲得Upload類型類時出現錯誤類的問題,這是一個記錄的Rails功能。簡單地增加class_name: "Contract到的has_many你的模型將解決這一:

associations documentation on customizing the query

自定義查詢

協會從關係建立,並且可以使用關係 語法定製他們。例如,添加一個條件:

class Blog < ActiveRecord::Base 
    has_many :published_posts, -> { where published: true }, class_name: 'Post' 
end 

是必要

在這種情況下多態關聯與STI,沒有。如果每個模型都支持db,那麼是的多態關聯可以提供幫助。有關示例,請參閱polymorphic associations with multiple models上的答案。

是否使用相同的has_attached_file

自從上述拉請求已被合併這是回形針一個非問題是一個好主意。可以覆蓋子類中的選項,回調,樣式,url或路徑,並享受OOP的好處以適應應用程序的需要。