Rails - 帮助rake任务

时间:2010-12-29 01:46:42

标签: ruby-on-rails rake rake-task

我需要运行一个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

如果我在gsub后做puts c.permalink!我可以看到它正确设置属性。但是节省!似乎没有工作,因为数据没有改变。有人能发现问题所在吗?

另一件事,我安装了回形针,这个任务触发[paperclip] Saving attachments.,我宁愿避免。

2 个答案:

答案 0 :(得分: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。)更改!= nil to除非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, '/', '');"

哇!一个查询。惊人! :)

答案 1 :(得分:1)

接下来我会尝试的是

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

至于没有回调的保存,this stackoverflow page有一些建议。