我正在使用Rails 3.1.1和Ruby 1.9.2。我正在将数据库从Ruby 1.8.7环境移动到Ruby 1.9环境,并希望执行以下迁移:
# coding: utf-8
class CleanseVerses < ActiveRecord::Migration
def up
Poem.all.each do |vs|
cleansed_text = String.new
cleansed_text = vs.text
cleansed_text.gsub!('—', '—')
cleansed_text.gsub!(' - ', ' — ')
cleansed_text.gsub!('’', '’')
cleansed_text.gsub!('“', '“')
cleansed_text.gsub!('â€', '”')
cleansed_text.gsub!('prince', 'king')
vs.text = cleansed_text
vs.save
end
end
def down
end
end
问题是数据库似乎没有反映任何更改。即使是简单的“王子”到“国王”转换也无效。
我在Poem.text字段中有attr_accessible。
我错过了字符串的基本内容吗?
更新:
似乎我遗漏了一些关于字符串性质的基本内容。
当我更改以下两行时:
cleansed_text = String.new
cleansed_text = vs.text
到
cleansed_text = String.new(vs.text)
然后一切都很完美。
答案 0 :(得分:1)
考虑
# coding: utf-8
vs = '— - ’ “ †prince'
vs.gsub!('—', '—')
.gsub!(' - ', ' — ')
.gsub!('’', '’')
.gsub!('“', '“')
.gsub!('â€', '”')
.gsub!('prince', 'king')
puts vs
打印— — ’ “ ” king
gsub!
结束时的爆炸表明它运作到位。请注意,#gsub!
与#gsub
不同,后者未进行适当修改。
您可以直接在vs.text
执行此操作,因为它已经是一个字符串并完全跳过整个cleansed_text
。
所有这一切,我能想到你的例子不起作用的唯一两个原因是
Poem
课程没有通过text
在text
表格中代表专栏poems
的方法ActiveRecord
。虽然我了解您的更改目前尚未保留,但通常认为最好尽可能在down
方法中使您的迁移可逆。
如果您或您团队中的任何人使用Windows文本编辑器,请确保迁移doesn't have a byte order mark in it,以防万一。
由于您提到1.8,请在1.9中阅读how things have changed。
由于这看起来像编码转换,如果您知道旧的编码,为什么不能use String#encode
?