Rails Rails 5.2.0 RC1: Active Storage, Redis Cache Store, HTTP/2 Early Hints, CSP, Credentials

huacnlee · 2018年01月31日 · 最后由 n5ken 回复于 2018年02月03日 · 2065 次阅读
共收到 16 条回复

RubyChina 是不是尝鲜了?

可以考虑支持http2了

刚发现Elixir 的 plug也开始加入http2了

SpringBoot 2.0 RC 也加入了HTTP/2了。

huacnlee 回复

华顺哥动作好快, 我的还停在 dev 机器呢...

编写 aliyun-oss 存储实现的时候,顺便尝试了一把 ActiveStorage

与 Rails 结合很紧密,使用起来非常快捷简单,比 CarrierWave 好使很多!

增加了两个表:

  • active_storage_attachments - 与业务表的多对多关系
  • active_storage_blobs - 附件的 Meta 信息,例如文件名,尺寸 ...

假如我有个 photos 需要存储图片,大概是这样:

class Photo < ApplicationRecord
  has_one_attached :image
end

这里,photos 表将不需要 image 字段,而是依靠 has_one 的关系来关联 active_storage_attachments 表。

这样带来了新的问题,每次列表查询,如果需要头像,需要关联查询。

于是问题来了,这样多余的开销怎么办?

可以依靠 Cache 来解决

class Photo < ApplicationRecord
  has_one_attached :image

  def image_url
    # cache_key 带了 @photo 的 updated_at 信息,所以,每次 Photo 更新的时候,缓存能自动失效
    Rails.cache.fetch(self.cache_key("image_url")) do
        self.image.service_url
    end
  end
end
huacnlee 回复

是不是说,查询一组 User 的时候若要获得头像,还得加 eager loading 了?

用套娃缓存。

jasl 回复

对,这样有好处,可以自由增加各种各样的附件类型,无需调整数据库。

class Post < ApplicationRecord
  has_one_attached :image

  has_one_attached :cover
  has_many_attached :images
  has_many_attached :attachments
end
13楼 已删除

今天试了下Bootsnap,开启速度毫无变化……

Active Storage 不支持校验或者事务,这一点上还是无法替代 Carrierwave

direct_upload: true 的功能很方便,全交给客户端直接往云服务器上传,避免经过服务器,只需要这么一行:

<%= form.file_field :avatar, direct_upload: true %>

Boot large Ruby/Rails apps faster

n5ken Rails 文章功能设计 中提及了此贴 02月05日 13:22
huacnlee Rails 5.2.0 Released 中提及了此贴 04月10日 11:19
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册