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 エンジンを使用するため、古いyaml エンジンはキーsyckを出力しないようです。!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 は列名に 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
于 2012-04-14T22:52:38.317 に答える
2

ページの 1 つにデバッグ (パラメーター) を表示する際に、同じ問題が発生していました。それは私を際限なく苛立たせました。私はおそらく長い道のりを歩んできましたが、私は sqlite3 を使用しており、本番環境で Postgres を使用することを知っていたので、先に進み、Postgres データベースをローカルで構成しました (お尻の痛みのようなものです)。それを行った可能性のあるもう1つのことは、 エンコーディングを追加したdatabase.ymlファイルでした: unicode

時間と忍耐力がある場合は、本番環境で使用するのと同じデータベースをテストで使用することをお勧めします。

于 2012-04-15T14:42:37.850 に答える
0

irb かどうかはわかりませんが、Rails アプリケーション ルート内で試してみrails consoleてください (すべてのアクティブ レコード オブジェクトが正しく読み込まれます)。

Rails 2.x では

<your rails app> ruby script/console

Rails 3.x では

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