Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:多态模型还是不同大小图像的不同模型?_Ruby On Rails_Image_Oop_Amazon S3 - Fatal编程技术网

Ruby on rails Rails:多态模型还是不同大小图像的不同模型?

Ruby on rails Rails:多态模型还是不同大小图像的不同模型?,ruby-on-rails,image,oop,amazon-s3,Ruby On Rails,Image,Oop,Amazon S3,我有一个RoR申请,还有一个属于汽车的照片模型 照片存储按200x200>调整大小的图像 现在我必须在我的应用程序CarModel类及其照片中添加另一个具有其他类型图像的实体 如果我可以通过多态性关联使用照片与其他模型,那就太好了。但是:似乎我必须为这个类使用另一种类型的缩略图,而不是200x200> 我该怎么办 创建CarModelPhoto类并将其用于汽车模型? 添加变形关联,使照片可以属于该车的其他类别。 使用Blitline或Cloudinary等工具动态调整图像大小,使照片的图像不再限

我有一个RoR申请,还有一个属于汽车的照片模型

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

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

如果我可以通过多态性关联使用照片与其他模型,那就太好了。但是:似乎我必须为这个类使用另一种类型的缩略图,而不是200x200>

我该怎么办

创建CarModelPhoto类并将其用于汽车模型? 添加变形关联,使照片可以属于该车的其他类别。 使用Blitline或Cloudinary等工具动态调整图像大小,使照片的图像不再限于200x200px。-但我将图像存储在S3上——这似乎对性能不利。
这取决于你需要如何实现你的两个图像模型,你基本上有两种方法

DRY:如果您计划为两个图像模型实现类似的功能,那么您不应该重复您自己,而只创建一个多态模型

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


当然,你已经知道了,但是你可以为你的几何体创建不同的样式,所以如果你选择多态方式,你只需要找到不同的名称:缩略图车,:缩略图车模型等等,这取决于你需要如何实现你的两个图像模型,你基本上有两种方法

DRY:如果您计划为两个图像模型实现类似的功能,那么您不应该重复您自己,而只创建一个多态模型

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


当然,你已经知道了,但是你可以为你的几何体创建不同的样式,所以如果你选择多态的方式,你只需要找到不同的名称:缩略图车,:缩略图车模型等等

使用单表继承由照片模型继承的单独的CarPhoto模型和覆盖照片的模型方法。CarPhoto模型使用相同的照片表

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

我认为这将对您有所帮助。

使用单表继承,通过Photo model继承单独的CarPhoto模型,并覆盖Photo的模型方法。CarPhoto模型使用相同的照片表

class CarPhoto < Photo
  # In this override the photo model methods and validations of you car's photo.
end
我想这对你有帮助

您还可以通过指定长度和宽度来指定照片模型中照片的大小,在保存图像之前调整图像服务器端大小时,将填充该长度和宽度

保存图像的两个版本。缩略图和更大的尺寸。最终,S3上会有更多的文件,但空间很便宜,而且渲染的强度要小得多。通过使用这两种尺寸,您还可以摆脱因缩略图看起来不太理想而导致的分辨率降低的问题

例如,您可以将模型设置为:

Photo
  name
  file_type
所以对于monkey.png,您将有Photoname:monkey,文件类型: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
另外,请看一下文件上传。他们有S3集成和大量在线教程

您还可以通过指定长度和宽度来指定照片模型中照片的大小,在保存图像之前调整图像服务器端大小时,将填充该长度和宽度

保存图像的两个版本。缩略图和更大的尺寸。最终,S3上会有更多的文件,但空间很便宜,而且渲染的强度要小得多。通过使用这两种尺寸,您还可以摆脱因缩略图看起来不太理想而导致的分辨率降低的问题

例如,您可以将模型设置为:

Photo
  name
  file_type
所以对于monkey.png,您将有Photoname:monkey,文件类型: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
另外,请看一下文件上传。他们有S3集成和大量在线教程