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

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

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

任何帮助是极大的赞赏。

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

从PostgeSQL 8.x迁移到PostgreSQL 9.x时,您可能遇到二进制字符串兼容性问题。 默认表示在版本9中为hex,但在版本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执行heroku restart以重新启动应用程序。

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