Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

YAML output from rails console

When executing a command like y Grau.all in rails console I am getting these strange !binary strings instead of the attribute's name. Any idea how to fix this?

Thanks.

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

[UPDATES]

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>

I am using Rails 3.2.3, Ruby 1.9.3 on a Windows 7 64 bit.

like image 889
nunos Avatar asked Apr 07 '12 00:04

nunos


2 Answers

It appears to be because rails defaults to using the newer psych YAML engine, the older syck yaml engine doesn't output the !binary keys. If you're just wanting it for testing in the console you can switch back to the older yaml engine as a temp workaround:

 > 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=": [email protected]

 > 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: [email protected]

You would only need to do this when your ActiveRecord column names/attributes keys are encoded using Encoding::ASCII_8BIT which I think only happens with SQLite.


Update:

Since posting this answer the SQLite3 gem has been fixed to return utf8 for column names. Make sure you're using version 1.3.6 (or higher) of the sqlite3 gem. Then the default/newer psych yaml engine (which also supports human-readable unicode output) will work without problems:

 > 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: [email protected]
like image 121
pjumble Avatar answered Nov 10 '22 03:11

pjumble


I was encountering the same issue with displaying my debug(params) on one of my pages. It was frustrating me to no end. I probably took the long way around, but I had been using sqlite3, and knowing that I was going to use Postgres in production, I went ahead and configured the Postgres database locally (Kind of a pain in the butt). The other thing that might have done it was on the database.yml file I added encoding: unicode.

If you have the time and the patience it's probably best to use same database in test as you will use in production.

like image 23
Ed Winn Avatar answered Nov 10 '22 03:11

Ed Winn