【问题标题】:Rails Migration Failing to Update Text FieldRails 迁移无法更新文本字段
【发布时间】:2011-11-18 21:30:38
【问题描述】:

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

然后一切正常。

【问题讨论】:

  • 我的猜测是记录由于某种原因无法保存。尝试将vs.save 更改为vs.save!,这样如果记录没有保存就会引发异常。
  • 我用保存试过了!它没有引发任何异常。
  • 回复:更新。一个令人惊讶的结果。我很想听听更了解为什么会发生这种情况的人。你确定没有其他改变? String.new 根本不需要。如果vs.text 还不是字符串(或者您不确定),通过调用vs.text.to_s 进行显式转换可能是更好的方法。
  • 我很确定没有其他改变。这对我来说似乎也很神秘,但我觉得我过去曾遇到过这个确切的问题。

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


【解决方案1】:

考虑

# coding: utf-8
vs = '—  - ’ “ †prince'
vs.gsub!('—', '—')
  .gsub!(' - ',  ' — ')
  .gsub!('’',  '’')
  .gsub!('“',  '“')
  .gsub!('â€', '”')
  .gsub!('prince', 'king')
puts vs

打印— — ’ “ ” king

gsub! 末尾的 bang 表示它在原地运行。注意#gsub!#gsub 不一样,#gsub 没有就地修改。

您可以直接在 vs.text 上执行此操作,因为它已经是一个字符串并完全跳过整个 cleansed_text 事情。

说了这么多,我能想到你的例子不起作用的唯一两个原因是

  1. 您的更改无法保存,因为它们无法保存,并且
  2. 您的 Poem 类没有方法 text 来表示您的 poems 表中的列 text 通过 ActiveRecord

虽然我知道您的更改当前没有被持久化,但通常认为尽可能在down 方法中使您的迁移可逆是一个好主意。

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


既然您提到了 1.8,请务必阅读 1.9 中的 how things have changed

既然这看起来像是一种编码转换,如果你知道旧的编码,为什么不use String#encode

【讨论】:

  • 我更新了我的问题,但似乎我最初这样做的方式实际上并没有更改“文本”列中的文本。
猜你喜欢
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多