Rails - 多张照片带有回形针...这个想法有什么问题?

Rails - Multiple photos with paperclip...what's wrong with this idea?

我目前正在使用回形针和 imagemagick 为我的文章上传单张照片。我一直在寻找添加多张照片的方法。我不需要无限的照片,事实上我想限制每篇文章 8 张。所以这让我开始思考,仅仅拥有 8 个单独的附件有什么问题?是的,这意味着有 8 个独立的方法,路由 table 中的 8 个独立的行,等等……但那又怎样?我有一个非常低容量的网站,所以除了臃肿的代码之外,还有什么理由不这样做吗?我已经用 2 张照片对其进行了测试,它似乎效果很好。事实上,它似乎使事情变得更容易,因为您不需要考虑特定照片的 'id' 来使其出现在文章中的特定位置。

值得一提的是,每张照片都有一条看起来像这样的路线:

 get 'article/:id/remove_photo', to: 'articles#remove_photo', as: 'remove_article_photo'

我的模型中的语句如下所示:

has_attached_file :photo , :styles => { :small => '200>', :medium => '400>', :large => '600>' }
 validates_attachment :photo, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
  validates_attachment :photo, :less_than => 1.megabytes

需要有一个单独的方法来删除控制器中的每张照片:

def remove_photo 
@article = Article.find(params[:id])
@article.photo = nil
@article.save
redirect_to @article
end

是的,它的代码很多,但也非常容易理解。而且我比驴还笨,所以这很有帮助。 :D 任何输入将不胜感激。

老实说,让您了解为什么它不是最佳策略的最好方法是让您去实际执行它 -- 我觉得您会很快了解原因!不过,要真正回答您的问题,您的解决方案的主要缺陷是:

  • 维护成本增加 -- 假设您想为图像支持新的文件类型。您需要在八个地方更改它,而不仅仅是一个。 (这可以通过将大的 ol' 配置哈希提取到常量或配置文件中来缓解,这是减少重复静态数据的有效策略)。
  • 无法以 list-like 方式处理您的 list-like 数据 -- 因为您的照片现在位于 photo1photo2photo3等等,你会如何快速告诉我一篇文章有​​多少张照片?您如何按标题对照片进行排序?
  • 糟糕的代码——如果你是唯一的开发者,也许现在这并不重要......但最终即使你回头看它也会呻吟!

形式上,您的提议被称为 denormalization。在某些情况下,这是有道理的——非规范化数据通常可以更快地访问,并且可以更容易地提供某些约束(比如你希望每篇文章只允许八张照片)。

如果您要处理更多 hash-like 的数据集,它绝对有意义——例如,side_photo vs main_photo vs author_photo。不过,由于您的照片只是一个列表,我建议在您的数据库中创建一个照片模型,并将回形针参考附加到该模型(而不是文章)。

无论如何,您的数据模型由您决定!如果您最终对列进行非规范化,让我给您一些元编程,这将使您的生活更轻松:

def remove_photo
  @article = Article.find(params[:id])
  @article.send("photo#{params[:photo_id].to_i}=", nil)
  @article.save
  redirect_to @article
end

Ruby 中的 send 方法动态调用 object 上的一个方法,我在上面用它来子 photo_id 参数。因此,您只需要一条路线,匹配 DELETE articles/:id/photos/:photo_id,以及处理所有 photoX 列的操作。