来自rails控制台的YAML输出

在rails控制台中执行像y Grau.all这样的命令时,我得到了这些奇怪的!binary字符串而不是属性的名称。 知道如何解决这个问题吗?

谢谢。

 irb(main):003:0> y Grau.all ←[1m←[36mGrau Load (0.0ms)←[0m ←[1mSELECT "graus".* FROM "gr ←[1m←[35mEXPLAIN (0.0ms)←[0m EXPLAIN QUERY PLAN SELECT "grau EXPLAIN for: SELECT "graus".* FROM "graus" 0|0|0|SCAN TABLE graus (~1000000 rows) --- - !ruby/object:Grau attributes: !binary "aWQ=": 27 !binary "bm9tZQ==": 1 Grau !binary "Y3JlYXRlZF9hdA==": 2012-04-06 21:24:34.553163000 Z !binary "dXBkYXRlZF9hdA==": 2012-04-06 21:24:34.553163000 Z - !ruby/object:Grau attributes: !binary "aWQ=": 28 !binary "bm9tZQ==": 2 Grau !binary "Y3JlYXRlZF9hdA==": 2012-04-06 21:24:34.599963000 Z !binary "dXBkYXRlZF9hdA==": 2012-04-06 21:24:34.599963000 Z 

[更新]

 irb(main):001:0> Grau.find(1) ←[1m←[36mGrau Load (43.8ms)←[0m ←[1mSELECT "graus".* FROM "graus" WHERE "grau s"."id" = ? LIMIT 1←[0m [["id", 1]] => # irb(main):002:0> 

我在Windows 7 64位上使用Rails 3.2.3,Ruby 1.9.3。

它似乎是因为rails默认使用较新的psych YAML引擎,较旧的syck yaml引擎不输出!binary密钥。 如果您只是想在控制台中进行测试,可以切换回旧的yaml引擎作为临时解决方法:

  > y User.first User Load (0.0ms) SELECT "users".* FROM "users" LIMIT 1 --- !ruby/object:User attributes: !binary "aWQ=": 1 !binary "bmFtZQ==": Example User !binary "ZW1haWw=": user@example.com > YAML::ENGINE.yamler= 'syck' => "syck" > y User.first User Load (1.0ms) SELECT "users".* FROM "users" LIMIT 1 --- !ruby/object:User attributes: id: 1 name: Example User email: user@example.com 

当您使用Encoding::ASCII_8BIT对ActiveRecord列名/属性键进行编码时,您只需要执行此Encoding::ASCII_8BIT ,我认为这只能在SQLite中进行。


更新:

自发布此答案以来,已修复SQLite3 gem以返回列名称的utf8 。 确保您使用的是sqlite3 gem的1.3.6(或更高版本)。 然后默认/更新的psych yaml引擎(它也支持人类可读的unicode输出)将正常工作:

  > y User.first User Load (0.0ms) SELECT "users".* FROM "users" LIMIT 1 EXPLAIN (0.0ms) EXPLAIN QUERY PLAN SELECT "users".* FROM "users" LIMIT 1 EXPLAIN for: SELECT "users".* FROM "users" LIMIT 1 0|0|0|SCAN TABLE users (~1000000 rows) --- !ruby/object:User attributes: id: 1 name: irmão email: user@example.com 

我在其中一个页面上显示调试(params)遇到了同样的问题。 令我感到沮丧的是,我没有尽头。 我可能已经走了很长一段路,但我一直在使用sqlite3,并且知道我将在生产中使用Postgres,我继续在本地配置Postgres数据库(这是一种痛苦的屁股)。 可能做到的另一件事是在database.yml文件中添加了编码:unicode

如果你有时间和耐心,最好在测试中使用相同的数据库,就像你将在生产中使用一样。

我不确定irb,但是在rails应用程序根目录中尝试rails控制台(这将正确加载所有的activerecord对象)

在rails 2.x中

  ruby script/console 

在rails 3.x中

  rails c 

干杯