2010-12-29 4 views
0

У меня есть задача rake, которую мне нужно запустить, чтобы обезопасить (удалить косые черты) некоторые данные в базе данных. Вот задача:Рельсы - Помощь с задачей рейка

namespace :db do 
    desc "Remove slashes from old-style URLs" 
    task :substitute_slashes => :environment do 
    puts "Starting" 
    contents = Content.all 
    contents.each do |c| 
     if c.permalink != nil 
     c.permalink.gsub!("/","") 
     c.save! 
     end 
    end 
    puts "Finished"  
    end 
end 

Что позволяет запускать rake db:substitute_slashes --trace

Если я puts c.permalink после GSUB! Я вижу, что он правильно устанавливает атрибут. Однако спасение! похоже, не работает, потому что данные не изменены. Может ли кто-нибудь определить, в чем проблема?

Другое дело, у меня есть скрепка, и эта задача запускает [paperclip] Saving attachments., которого я бы предпочел избежать.

ответ

2

попробовать это:

namespace :db do 
    desc "Remove slashes from old-style URLs" 
    task :substitute_slashes => :environment do 
    puts "Starting" 
    contents = Content.all 
    contents.each do |c| 
     unless c.permalink.nil? 
     c.permalink = c.permalink.gsub(/\//,'') 
     c.save! 
     end 
    end 
    puts "Finished"  
    end 
end 

1.) Изменить = ноль для исключением случаев, когда record.item.nil!? (Я не знаю, если он изменится, но я никогда не использовал! = Nil. Возможно, вы захотите использовать .blank? Также судя по вашему коду)

2.) Ваш gsub был искажен. Шаблон должен быть между двумя/(/ stuff /). \ Необходимо, потому что вам нужно избежать /.

3.) Bang (!) Обновляет объект на месте. Я думаю, что ваша самая большая проблема может заключаться в том, что вы чрезмерны!

4.) Вы также делаете это очень неэффективным ... Вы смотрите на каждую запись и обновляете каждую запись. Rails - не всегда лучший вариант. Узнайте SQL и сделать это в одной строке:

"UPDATE contents SET permalink = replace(permalink, '/', '');" 

Если вы ДОЛЖНЫ использовать Rails:

ActiveRecord::Base.connection.execute "UPDATE contents SET permalink = replace(permalink, '/', '');" 

Wow! Один запрос. Удивительно! :)

+0

! = Nil отлично подходит, также строка # gsub может принимать строку в качестве своего первого аргумента. Третий момент, который я считаю верным, верен. – gunn

+0

как я сказал, я просто не был уверен, но im 100% уверен, что .nil? делает :). im все еще не полностью убежден в том, что gsubive не смог заставить gsub работать в irb на mac Ruby v 1.8.1. 3.) определенно его проблема, В ЭТОМ СЛУЧАЕ, но его самой большой проблемой является то, что он не использует SQL. Это выполнимо, как я уже опубликовал, - в ONE-заявлении, которое SOOOO намного быстрее, чем при создании объекта ActiveRecord для элемента EACH. Вместо этого он мог бы использовать .find_each вместо этого! – sethvargo

+0

Удивительный. Здесь есть много самородков для рельсов newb. Я ценю, что вы тратите время, чтобы все это исправить. – jyoseph

1

Следующая вещь, которую я хотел бы попробовать бы

c.permalink = c.permalink.gsub("/","") 

Что касается экономии без обратных вызовов, this stackoverflow page есть некоторые предложения.

+0

ваша ссылка на «эта страница stackoverflow» рекурсивна .. :) – sethvargo

+0

Упс, это было глупо. Обновлено сейчас. Благодарю. – gunn

+0

haha ​​я нашел это занимательным;) – sethvargo

Смежные вопросы