Ruby on rails 如何通过Rails迁移查找和替换列中的数据

Ruby on rails 如何通过Rails迁移查找和替换列中的数据,ruby-on-rails,ruby,ruby-on-rails-3,postgresql,migration,Ruby On Rails,Ruby,Ruby On Rails 3,Postgresql,Migration,我在一个名为“通知”的表中有一个名为“meta”的列。列中的数据如下所示: --- :full_name: Dude :user_id: 1 :update_id: 10 :update_type: want :update_name: Some name here --- :full_name: Dude :user_id: 1 :post_id: 10 :post_type: want :post_name: Some name here 我想把它改成这样: --- :full_name

我在一个名为“通知”的表中有一个名为“meta”的列。列中的数据如下所示:

---
:full_name: Dude
:user_id: 1
:update_id: 10
:update_type: want
:update_name: Some name here
---
:full_name: Dude
:user_id: 1
:post_id: 10
:post_type: want
:post_name: Some name here
我想把它改成这样:

---
:full_name: Dude
:user_id: 1
:update_id: 10
:update_type: want
:update_name: Some name here
---
:full_name: Dude
:user_id: 1
:post_id: 10
:post_type: want
:post_name: Some name here
实现这一目标的迁移是什么样子的

def up 
  execute "update notifications set meta = replace(meta, 'update', 'post')"
end
我不完全确定双引号/单引号,因为我看到它们有时工作,有时甚至在同一个SQL引擎的不同版本中失败

使用SQL迁移数据通常是一个好主意,因为您的ruby模型可能会随着时间的推移而改变,并导致迁移无法使用,例如,由于更改了验证约束。在ruby中也是如此

def up
  Notification.find_each{ | n | n.update_attribute(:meta, n.meta.gsub('update','post')) }
end

如何访问元列?它是纯字符串还是以任何方式序列化?@christian.buggle只是一个字符串小心,如果您的“此处的某个名称”包含术语“更新”,您可能希望将替换限制为一个正则表达式,从而排除这一点。这很小,但它可能是一个
通知
类,而不是
通知