Rails Migration Не удалось обновить текстовое поле - PullRequest
1 голос
/ 19 ноября 2011

Я использую 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

Проблема состоит в том, что база данных, кажется, не отражает ни одного изизменения.Даже простое преобразование «принц» в «король» не работает.

У меня действительно есть attr_accessible в поле Poem.text.

Я что-то упустил из фундаментальных строк?

ОБНОВЛЕНИЕ:

Кажется, мне не хватает чего-то фундаментального в природе строк.

Когда я изменяю следующие две строки:

cleansed_text = String.new
cleansed_text = vs.text

на

cleansed_text = String.new(vs.text)

тогда все отлично работает.

1 Ответ

1 голос
/ 19 ноября 2011

Рассмотрим

# 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 не имеет метода text, который представляет столбец text в вашей таблице poems через ActiveRecord.

Хотя я понимаю, что ваши изменения в настоящее время не сохраняются, обычно считается хорошей идеей сделать ваши миграции обратимыми в методе down, когда это возможно.

Если вы или кто-либо в вашей команде используете текстовый редактор Windows, убедитесь, что в вашей миграции нет метки порядка байтов , на всякий случай.


, посколькуВы упомянули 1.8, прочитайте о как делазавис в в 1.9.

И поскольку это выглядит как преобразование кодировки, если вы знаете старую кодировку, почему бы вам не использовать String#encode?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...