怪事:
我正在使用postgres后端在rails 4.1中工作.我的一个模型有一些数组字段,我希望这些字段由'pg'gem(0.17.1)正确处理.我的迁移文件和生成的模式可以在下面找到.
有问题的字段是字符串数组.下面,我发布了迁移,生成的模式以及似乎不起作用的代码(以及在rails控制台中运行此代码时的输出).
用户模型中没有引用此字段的任何内容.
移民:
add_column :users, :test, :string, :array => true, default: '{}'
Run Code Online (Sandbox Code Playgroud)
模式:
t.string "test", default: [], array: true
Run Code Online (Sandbox Code Playgroud)
以下是我在rails控制台中重现此步骤的步骤(假设已创建基本用户模型来保存字段):
u = User.first()
u.test.push('testValue')
u # => #<User id: 1, name: "dave", passhash: nil, email: nil, created_at: "2014-10-04 10:12:29", updated_at: "2014-10-04 10:12:29", provider: "identity", uid: "1", oauth_token: nil, oauth_expires_at: nil, test: ["testValue"]>
u.save
User.find(1).test # => []
Run Code Online (Sandbox Code Playgroud)
因此,用户记录似乎已正确初始化 - 它为该字段设置了一个空数组 - 我可以对其进行数组操作.但不知何故,我无法进行任何修改.
仅供参考,我可以使用相同的程序修改和保存其他字段; 它只是表现得像这样的数组.
有任何想法吗?
编辑:
u.test.push('newitem')按照我的预期返回新数组.没有任何问题的迹象,或者validates_uniqueness_of有些错误 - 我会在控制台中看到这个问题吗?感谢第一条评论,我现在使用'更新'进行测试:
u.update(test: [(u.test << 'testValue')].flatten)
Run Code Online (Sandbox Code Playgroud)
给了我想要的行为,但它看起来很笨拙.我需要在模型中改变一些东西吗?我不确定我正在做什么使validates_uniqueness_of fire(它没有在模型中设置).