Ruby on rails 来自rails控制台的YAML输出

Ruby on rails 来自rails控制台的YAML输出,ruby-on-rails,ruby,console,yaml,Ruby On Rails,Ruby,Console,Yaml,在rails控制台中执行类似于y Grau.all的命令时,我得到了这些奇怪的!二进制字符串,而不是属性名称。你知道怎么解决这个问题吗 谢谢 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

在rails控制台中执行类似于
y Grau.all
的命令时,我得到了这些奇怪的
!二进制
字符串,而不是属性名称。你知道怎么解决这个问题吗

谢谢

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]]
=> #<Grau id: 1, nome: "1º Grau", created_at: "2012-04-11 15:51:32", updated_at:
 "2012-04-11 15:51:32">
irb(main):002:0>
irb(main):001:0>Grau.find(1)
←[1m←[36mGrau负载(43.8ms)←[0m←[1选择“graus”。*从“graus”中选择“grau”
s.““id”=?限制1←[0m[[“id”,1]]
=> #
irb(主要):002:0>

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

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

在Rails 2.x中

ruby脚本/控制台
在Rails 3.x中

rails c

这似乎是因为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
只有当ActiveRecord列名/属性键使用
Encoding::ASCII_8BIT
编码时,才需要这样做,我认为这只会发生在SQLite上


更新: 发布此答案后,SQLite3 gem已被修复。请确保您使用的是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

在我的一个页面上显示我的调试(参数)时,我遇到了同样的问题。这让我非常沮丧。我可能花了很长的时间,但我一直在使用sqlite3,并且知道我将在生产中使用Postgres,于是我继续在本地配置Postgres数据库(有点痛苦)。 另一件可能已经完成的事情是在我添加的database.yml文件上 编码:unicode


如果您有时间和耐心,最好在测试中使用与生产中相同的数据库。

您能给出一个仅一个
Grau
对象的示例吗?Grau.find(1)(或任何其他有效ID)控制台中的输出是什么?它也是二进制的吗?您使用的是什么版本的ruby和rails?根据要求更新了问题。请看一看。谢谢。谢谢您的回答。它很有效!是否可以运行该命令来自动更改yaml引擎或任何我可以更改的配置文件,这样我就不必每次手动执行此操作?谢谢。您只是想吗g它在rails控制台中?如果是这样,您可以将
YAML::ENGINE.yamler='syck',如果定义的话?(rails::console)
在您的
开发中.rb
就是这样。但是,现在,我得到的是一些特殊字符的unicode表示形式,比如
irm\xC3\xA3o
,而不是
irmão
。在我的葡萄牙语语言中,能够在控制台上看到这些字符非常重要。知道如何解决这个问题?谢谢。
 > 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
 > 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