怪诞:
我在rails 4.1中使用postgres后端工作。我的一个模型有一些数组字段,我希望这些字段可以通过' pg'宝石(0.17.1)。我的迁移文件和生成的模式可以在下面找到。
有问题的字段是字符串数组。下面,我发布了迁移,生成的模式以及似乎无法正常工作的代码(以及在rails控制台中运行此代码时的输出)。
我在User模型中没有引用此字段的任何内容。
迁移:
add_column :users, :test, :string, :array => true, default: '{}'
模式:
t.string "test", default: [], array: true
以下是我在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 # => []
因此用户记录似乎已正确初始化 - 它为该字段设置了一个空数组 - 我可以对其进行数组操作。但不知何故,我无法进行任何修改。
仅供参考,我可以使用相同的程序修改和保存其他字段;它的只是表现得像这样的数组。
有什么想法吗?
编辑:
u.test.push(&#39; newitem&#39;)按照我的预期返回新数组。没有任何出错的迹象,或者对validates_uniqueness_of有些错误 - 我会在控制台中看到这个问题吗?感谢第一条评论,我现在使用&#39;更新&#39;
进行了测试u.update(test: [(u.test << 'testValue')].flatten)
给了我我想要的行为,但它看起来很笨拙。我需要在模型中改变一些东西吗?我不知道我在做什么使得validates_uniqueness_of fire(它没有在模型中设置)。
答案 0 :(得分:5)
在ActiveRecord字段上使用像push
或<<
这样的ruby数组运算符存在(至少曾经存在)问题。它们未标记为脏,并且未在save
的数据库中更新。试试这个:
u = User.first()
u.test_will_change!
u.test.push('testValue')
u.save
User.find(1).test
attribute_will_change!
将属性标记为脏,确保将其序列化并保存到save
上的数据库中。