2013-05-20 15 views
2

我有一个使用默认Rails序列化序列化数组的模型。看哪:Rails序列化将0转换为字符串

class Account < ActiveRecord::Base 
    serialize :number_of_free_jobs 
end 

number_of_free_jobs是FixNums数组,但由于某种原因Rails正在将所有的0到字符串的条目,但保留其余为FixNums,检查:

account = Account.last 
account.number_of_free_jobs = [10, 5, 0, 1] 
account.save 
account.number_of_free_jobs 
=> [10, 5, "0", 1] 

转换0到一个字符串意味着一些比较失败。我可以将该阵列与to_i映射,但我很好奇为什么会发生这种情况。我使用的Rails 3.2.13和Ruby 1.9.3

+1

你能在你的轨道控制台执行下面的代码吗?对不起,这应该是一个评论,但没有风格它会令人困惑。 a = [10,5,0,1] b = a.to_yaml c = YAML.load(b)你会得到什么? –

+0

这导致了相同的问题。我发现了这个问题,查看我的答案。谢谢! – jackbot

回答

0

问题在于Tolk gem安装safe_yaml作为依赖项。删除Tolk删除了依赖和零不再被转换为字符串。一个奇怪的位,我会研究为什么safe_yaml这样做...

+0

猴子修补的副作用!您应该在safe_yaml的[问题跟踪器](https://github.com/dtao/safe_yaml/issues)上报告此行为/错误 – CuriousMind

1

这并不在我的机器上出现(SQLITE3,Rails的3.2.13 &红宝石1.9.3):

Loading development environment (Rails 3.2.13) 
irb(main):001:0> Account 
=> Account(id: integer, number_of_free_jobs: string, created_at: datetime, updated_at: datetime) 
irb(main):002:0> Account.create 
    (0.1ms) begin transaction 
    SQL (9.5ms) INSERT INTO "accounts" ("created_at", "number_of_free_jobs", "updated_at") VALUES (?, ?, ?) [["created_at", Mon, 20 May 2013 18:19:26 UTC +00:00], ["number_of_free_jobs", nil], ["updated_at", Mon, 20 May 2013 18:19:26 UTC +00:00]] 
    (179.1ms) commit transaction 
=> #<Account id: 2, number_of_free_jobs: nil, created_at: "2013-05-20 18:19:26", updated_at: "2013-05-20 18:19:26"> 
irb(main):003:0> account = Account.last 
    Account Load (0.3ms) SELECT "accounts".* FROM "accounts" ORDER BY "accounts"."id" DESC LIMIT 1 
=> #<Account id: 2, number_of_free_jobs: nil, created_at: "2013-05-20 18:19:26", updated_at: "2013-05-20 18:19:26"> 
irb(main):004:0> account.number_of_free_jobs = [10, 5, 0, 1] 
=> [10, 5, 0, 1] 
irb(main):005:0> account.save 
    (0.1ms) begin transaction 
    (0.4ms) UPDATE "accounts" SET "number_of_free_jobs" = '--- 
- 10 
- 5 
- 0 
- 1 
', "updated_at" = '2013-05-20 18:19:46.430558' WHERE "accounts"."id" = 2 
    (155.9ms) commit transaction 
=> true 
irb(main):006:0> account.number_of_free_jobs 
=> [10, 5, 0, 1] 

你能提供的步骤重现这个问题?也许在github上有这样的错误/错误/行为的示例应用程序?