我有一个RoR应用程序,并且拥有属于 Car 的 Photo 模型。
照片存储按200x200>调整大小的图片。
现在我必须在我的应用程序中添加另一个带有其他类型图像的实体( CarModel 类及其照片)。
如果我可以通过与其他模型的多态关联使用Photo,那将是很好的。但是:似乎我将不得不为这个类使用其他类型的缩略图(而不是200x200>)。
我该怎么办?
答案 0 :(得分:2)
使用STI(单表继承)制作单独的CarPhoto模型,由Photo模型继承并覆盖照片的模型方法。 CarPhoto模型使用相同的照片表。
class CarPhoto < Photo
# In this override the photo model methods and validations of you car's photo.
end
我认为这会对你有所帮助。
答案 1 :(得分:1)
这取决于你需要如何实现2个图像模型,你基本上有2种方法
DRY:如果你计划为你的两个图像模型实现类似的功能,那么你不应该重复自己并只创建一个多态模型
保持代码简短:如果您的2个照片模型将实现不同的功能,最好将它们分开以保持代码清洁,易于阅读和维护
并且,您当然知道,但是您可以为几何创建不同的样式,因此如果您选择多态方式,您只需要找到不同的名称:thumbnail_car,:thumbnail_car_model等等
答案 2 :(得分:1)
您还可以通过指定长度和宽度,在照片模型中指定照片大小的路线在保存图像之前调整图像服务器端大小时将填充的内容。
保存图片的两个版本。缩略图和更大的尺寸。您将在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集成,并且在线存在大量教程。