Rails迁移无法更新文本字段

时间:2011-11-18 21:30:39

标签: ruby-on-rails ruby ruby-on-rails-3 rails-migrations

我正在使用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)

然后一切都很完美。

1 个答案:

答案 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

所有这一切,我能想到你的例子不起作用的唯一两个原因是

  1. 您的更改未被保留,因为它们无法保存,
  2. 您的Poem课程没有通过texttext表格中代表专栏poems的方法ActiveRecord
  3. 虽然我了解您的更改目前尚未保留,但通常认为最好尽可能在down方法中使您的迁移可逆。

    如果您或您团队中的任何人使用Windows文本编辑器,请确保迁移doesn't have a byte order mark in it,以防万一。


    由于您提到1.8,请在1.9中阅读how things have changed

    由于这看起来像编码转换,如果您知道旧的编码,为什么不能use String#encode