当我已经有了备份数据时,如何在不实例化整个对象的情况下使PaperClip生成文件URL?

时间:2018-11-29 23:58:52

标签: ruby-on-rails paperclip

出于性能原因,我遇到了一种情况,我希望/需要使用视图来加载数据,而不是先获取根对象,然后再获取N + 1查询中的相关对象。我不想在任何地方重复该查询,而是想在视图中编码(使用风景秀丽的视图),这样我就可以重用基本逻辑-不必复制整个查询然后修改原始SQL,可以使用该视图,然后标准的活动记录查询方法。

不幸的是,我需要在响应中序列化的部分数据是由PaperClip生成的,我不确定如何解决此问题。

我的用户模型中有一张通过PaperClip存储的照片。序列化数据时,我可以像user.photo? ? user.photo.url : nil一样容易地进行序列化。不幸的是,由于我没有实例化用户类,所以虽然我拥有结果URL的所有 components (我的视图提取了整个用户表,并添加了额外的数据),但我不确定如何可以将它们组合在一起以生成实际 URL。我不想再次调用数据库来实例化用户对象,但是我不认为我可以使用现有的列数据来实例化用户对象。

我觉得我可能在这里似乎缺少了一些显而易见的东西,即某种方式使用获取的列数据实例化用户对象,只是没有看到它。

1 个答案:

答案 0 :(得分:0)

所以它可能并不理想,但是我找到了一种方法。

在我的视图对象中,我通过实例化一个用户对象来模仿相关的数据方法:

  def photo?
    User.new(user_attributes).photo?
  end

  def photo
    User.new(user_attributes).photo
  end

  def user_attributes
    attributes.slice(* User.column_names)
  end

从长远来看,我想我可能希望将其中一些逻辑移到视图层的帮助器中。将其留在支持数据库视图的模型对象中似乎很糟糕。