грабли / рельсы не обновляет базу данных - PullRequest
8 голосов
/ 02 января 2012

Я пытаюсь сохранить изменения в моей базе данных с помощью граблей.

В моей задаче о граблях я делаю что-то вроде:

namespace :parts do
  desc "Update Parts table, swap names in title"
  task :swap => :environment do
    Part.swap
  end
end

В моем классе Part я делаю

def self.swap
  Part.all.each do |part|
    if (part.title =~ REGEX) == 0
      part.title.gsub! REGEX, '\2 \1'
      puts part.title
      part.save!
    end
  end
end

Однако это не сохраняет детали. save! возвращает true. puts part.title возвращает значение, которое я хочу.

Если я позвоню

Part.update(part.id, title: part.title)

База данных обновляется правильно. Почему это? Я делаю что-то не так в своей петле? Я работаю с Rails 3.1.3, Rake 0.9.2.2 и MySQL2 0.3.7

1 Ответ

17 голосов
/ 02 января 2012

Это потому, что ActiveRecord обнаруживает, что атрибуты изменены, через установщик.Поэтому, если вы используете gsub! для атрибута, ActiveRecord не знает, что ему нужно обновить базу данных.

Возможно, вам придется сделать это:

part.title = part.title.gsub REGEX, '\2 \1'

Обновить скомментарий

Также, если вы попытаетесь присвоить заголовок другой переменной, а затем gsub!он также не будет работать, потому что это один и тот же объект (код из моего проекта, имена переменных разные).

ruby-1.9.3-p0 :020 > t = p.name
 => "test" 
ruby-1.9.3-p0 :023 > t.object_id
 => 70197586207500 
ruby-1.9.3-p0 :024 > p.name.object_id
 => 70197586207500 
ruby-1.9.3-p0 :025 > t.gsub! /test/, 'not a test'
 => "not a test" 
ruby-1.9.3-p0 :037 > p.name = t
 => "not a test" 
ruby-1.9.3-p0 :026 > p.save
   (37.9ms)  BEGIN
** NO CHANGES HERE **
   (23.9ms)  COMMIT
 => true 

Вы должны .dup строку перед ее изменением.

ruby-1.9.3-p0 :043 > t = p.name.dup
 => "test" 
ruby-1.9.3-p0 :044 > t.gsub! /test/, 'not a test'
 => "not a test" 
ruby-1.9.3-p0 :045 > p.name = t
 => "not a test" 
ruby-1.9.3-p0 :046 > p.save
   (21.5ms)  BEGIN
   (20.8ms)  UPDATE "projects" SET "name" = 'not a test', "updated_at" = '2012-01-02 07:17:22.892032' WHERE "projects"."id" = 108
   (21.5ms)  COMMIT
 => true 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...