Rails 4.1 Postgres字符串数组:修改后无法保存

时间:2014-10-04 10:43:40

标签: ruby-on-rails arrays pg

怪诞:

我在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(它没有在模型中设置)。

1 个答案:

答案 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上的数据库中。