2013-03-19 42 views
1

我得到了一個RoR應用程序,並有一個屬於汽車一個照片模型。Rails:不同大小的圖像的多態模型或不同模型?

照片存儲由200×200大小的圖像>。

現在我必須添加另一個實體與其他類型的圖像到我的應用程序(CarModel類和它的照片)。

這將是很好,如果我可以通過與其他車型多態關聯使用的照片。但是:似乎我將不得不爲這個類使用另一種類型的縮略圖(不是200x200>)。

我該怎麼辦?

  1. 創建CarModelPhoto類並將其與Car模型一起使用?
  2. 添加polymorphc關聯,以便照片可能屬於其它類汽車。
  3. 使用的工具(如Blitline或Cloudinary),其調整的飛行圖像,使照片的圖像停止侷限於200x200px。 - 但我在S3上存儲圖像 - 看起來它會對性能造成影響。

回答

1

這取決於你需要如何實現你的2個圖像模型,您基本上有2個技術途徑

幹:如果您計劃實現爲您的圖像模型類似的功能,那麼你不應該重複你的自我並創建只有一個多態模型

保持代碼的短:如果您2個照片車型將實現不同的功能,最好將它們分開,以保持你的代碼整潔,易於閱讀和維護

而且,你一定已經知道,但你c爲你的幾何創建不同的風格,所以如果你選擇多態的方式,你只需要找到不同的名稱:thumbnail_car,:thumbnail_car_model等

2

使用STI(單表繼承)製作單獨的CarPhoto模型模型和重寫照片的模型方法。 CarPhoto型號使用相同的照片表格。

class CarPhoto < Photo 
    # In this override the photo model methods and validations of you car's photo. 
end 

我想這會幫助你。

+0

這是一個很好的答案,你有我的投票親愛的同事:) – Benj 2013-03-19 12:51:23

+0

謝謝本傑明:) – 2013-03-19 12:52:11

1
  1. 你也可以走在其中指定照片的大小在照片模型,通過指定長度寬度你會填充路徑,當你調整圖像服務器在保存圖像之前。你的形象

  2. 保存兩個版本。縮略圖和更大的尺寸。你將在S3上獲得更多的文件,但空間很便宜 - 而且在渲染方面它的密集程度要低得多。通過擁有這兩種尺寸,您還可以擺脫處理縮略圖的分辨率降低問題,這看起來不太理想。

例如,你可以設置你的模型,例如:

Photo 
    name 
    file_type 

所以對於monkey.png,你必須Photo(name: "monkey", file_type: "png") 然後你會調整圖片的大小爲所需大格式並將其另存爲「monkey_large.png」和縮略圖「monkey_thumb.png」(或者將「monkey.png」另存爲兩個分開的目錄large/thumb/)。

所以在顯示時,你可以對照片的方法做一個簡單的字符串連接(使用保存圖像的不同目錄方法):

def image_path_thumbnail 
    "#{<s3 path>/thumb/#{image_name}.{image_file_type}" 
end 

def image_path_large 
    "#{<s3 path>/large/#{image_name}.{image_file_type}" 
end 

此外,看一看PaperClip文件上傳。他們有S3集成和大量的在線教程。

相關問題