5

当在 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]]
=> #<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>

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

4

3 回答 3

10

这似乎是因为 rails 默认使用较新的psychYAML 引擎,较旧的syckyaml 引擎不输出!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 列名称/属性键使用我认为只有 SQLite 才会发生的编码时,您才需要这样做。


更新:

自发布此答案以来,SQLite3 gem 已修复为返回 utf8 for column names。确保您使用的是 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
于 2012-04-14T22:52:38.317 回答
2

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

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

于 2012-04-15T14:42:37.850 回答
0

我不确定 irb,但rails console请在 Rails 应用程序根目录中尝试(这将正确加载所有活动记录对象)

在 Rails 2.x 中

<your rails app> ruby script/console

在 Rails 3.x 中

<your rails app> rails c
于 2012-04-07T05:19:07.397 回答