ActiveRecord在Heroku上错误地加载二进制字段,在OSX上很好

And*_*ris 8 postgresql encoding activerecord ruby-on-rails rails-activerecord

我有一个rails 3.1应用程序,它将图像存储在postgresql数据库的二进制字段中(我知道在数据库中存储图像的潜在问题,但现在必须这样做).在开发模式和OSX上的规格本地一切都很好,但所有图像都在部署到Heroku的应用程序中被破坏.我已经通过将本地计算机指向heroku实例使用的同一数据库并且所有图像都正确显示来验证数据库中的数据是否正确.

所以,问题似乎在于ActiveRecord(在Heroku上运行)从数据库加载数据.我也猜测这是一个编码问题.在本地运行rails控制台我可以验证这些字段的字节大小是否正确,但在Heroku上运行rails控制台显示错误的字节大小.实际上,在Heroku上通过ActiveRecord加载N字节文件会导致所有文件的字节大小为2N + 1.

任何帮助是极大的赞赏.

mu *_*ort 16

2n + 1的气味就像你从你的bytea而不是旧的转义格式获得十六进制输出.我猜你正在使用专用数据库,这意味着PostgreSQL 9.0具有不同的bytea默认编码:

从PostgeSQL 8.x迁移到PostgreSQL 9.x时,您可能会遇到二进制字符串兼容性问题.默认表示在版本9中为十六进制,但在版本8中设置为转义.您可以通过手动设置bytea_output使PostgreSQL 9使用转义.

如果我是对的,您可以使用上面链接中的说明或使用此摘要版本:

  1. 在命令行中键入" heroku config vars "以获取系统详细信息.
  2. 从你的DATABASE_URL看起来像提取PostgreSQL用户名postgres://username:password@host/database_name.
  3. 使用heroku pg:psql得到PostgreSQL的控制台.
  4. ALTER ROLE username SET bytea_output TO 'escape';psql控制台执行,当然username是(1)的用户名.
  5. 退出psql执行a heroku restart重新启动您的应用程序.

然后再试一次,希望你能得到正确的字节.

  • 仅供参考,我们Heroku Postgres已将此作为所有新入门级数据库的默认值(`SET bytea_output TO'excape'.).您可以通过运行`select set from pg_settings where name ='bytea_output';`来验证这一点 (2认同)