Rails 发个牢骚,刚刚被 CarrierWave 给玩儿了一下

lukefan · 2020年03月06日 · 最后由 lukefan 回复于 2020年03月09日 · 2872 次阅读

我使用 mongoid,用 carrierwave 存储信息。 前面犯二,将一个图片格式的信息,通过 embed 嵌入表的形式存储了。每次做操作的时候都非常痛苦。 今天下决心将所有的数据,重新导到了外面,变成了一个独立的表,从 embeds_many,变成了 has_many 结果发现,所有的图片都取不出来了。 还为此打电话去七牛。

各种方法都试了一遍,最后突然想起来,carrierwave 的路径名,是自己生成的。 数据库里面只有一个字段,就是最终的文件名。

def store_dir
  "#{mounted_as}/#{model.id}/"
end

uploader 模块中有上面这个函数。 我重新倒了一遍数据库,model.id 变化了。 于是原来存储的所有文件,路径都错了。

还在折腾中。应该问题不大了。

切忌,尽量少在 mongid 里面使用嵌入表,查询修改都很麻烦。 在使用 carrierwave 的时候,各种文件名,都是计算出来的。比如远程的 url,就是路径加上数据库字段里面存储的文件名。 如果有 avatar 之类的图像版本,就再把这个前缀加到文件名里面去。就是这样神奇。

一直希望可以在 mongoid 里面使用 ActiveStorage,不过这么长时间了,好像一直都没有人去折腾。

那可以换 mysql 了

那可以换 pg 了

能嵌入只应该是那些不需要更新的数据,,,,图片 URL,谁没事更新。。。

mongodb,一直在用。中间也偶尔会用到 pg。mysql 在被 oracle 收购之后,就用得很少了。 用了一段时间的 mongodb 之后,再要回去用 pg,是非常辛苦的。各种表的结构都是固定的,不像是 mongodb,随时随地的调整,加减内容,每个文档都不需要保持相同。 在数据量没有那么大的情况下,各种数据库的效率其实是差不多的。 在复杂的统计分析方面,mongodb 肯定是没有 SQL 方便,在数据量不大的时候做 aggregation 其实 SQL 有的功能基本也都能实现。数据量大的时候,通过 MapReduce 也还是可以实现的。 NoSQL 数据库,复杂的统计分析,肯定是比较麻烦实现的。这东西本来也不是为了那种上万实体,每个实体几十上百个字段的复杂系统设计的。 不过,用来搞网站还是基本够用的。

pynix 回复

嵌入的数据,倒不是经常需要修改。只是在统计、或者一些状态判断的时候很麻烦。 另外,我还遇到了一个窝心的事情,原来用早期的 carrierwave 版本学的爬虫程序,没 mount 的字段,比如是 picture 吧,那么数据库里面存的字段就是 picture_filename。现在用新版本的 rails 和 carrierwave 写了一个 graphql 服务器,默认的字段名变成了 picture,每次都需要把字段名换一下。 对于普通的 collection,直接做 JavaScript:

db.collection.update({},{$rename:{"picture_filename":"picture"}});

或者用 mongoid 在 Rails 环境下

Picture.all.rename(picture_filename: 'picture')

就可以了,在嵌入式文档里面,实在是没搞明白怎么折腾。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号