1

我有一个 RoR 应用程序,并且有一个属于Car的Photo模型。

照片存储按 200x200> 调整大小的图像。

现在我必须在我的应用程序中添加另一个带有其他类型图像的实体(CarModel类及其照片)。

如果我可以通过与其他模型的多态关联来使用 Photo,那就太好了。但是:看来我将不得不为此类使用另一种类型的缩略图(不是 200x200>)。

我该怎么办?

  1. 创建 CarModelPhoto 类并将其与汽车模型一起使用?
  2. 添加多态关联,以便 Photo 可以属于 Car 的其他类。
  3. 使用动态调整图像大小的工具(如 Blitline 或 Cloudinary),使 Photo 的图像不再被限制为 200x200px。- 但我将图像存储在 S3 上 - 这似乎对性能不利。
4

3 回答 3

2

使用 STI(单表继承)制作由 Photo 模型继承的单独 CarPhoto 模型并覆盖 photo 的模型方法。CarPhoto 模型使用相同的照片表。

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

我认为这会对你有所帮助。

于 2013-03-19T12:07:14.773 回答
1

这取决于你需要如何实现你的 2 个图像模型,你基本上有 2 种方法

DRY:如果你打算为你的两个图像模型实现类似的功能,那么你不应该重复你自己并且只创建一个多态模型

保持你的代码简短:如果你的 2 张照片模型将实现不同的功能,最好将它们分开以保持你的代码干净,易于阅读和维护

而且,您当然已经知道,但是您可以为您的几何图形创建不同的样式,所以如果您选择多态方式,您只需要找到不同的名称:thumbnail_car、:thumbnail_car_model 等等

于 2013-03-19T12:05:43.650 回答
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/)。

因此,在显示时,您可以在 Photo 上使用一个方法进行简单的字符串连接(使用不同的目录方法来保存图像):

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 集成,并且在线存在大量教程。

于 2013-03-19T12:14:27.307 回答