我有一个耙子任务,我需要运行以便对数据库中的某些数据进行消毒(删除前向斜线)。这是任务:

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. 我宁愿避免。

有帮助吗?

解决方案

尝试这个:

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除非记录。 (我不知道它是否有所不同,但是我从未使用过!= nil。

2.)您的GSUB畸形。该模式必须在两个 /( / tuck /)之间。 是必要的,因为您需要逃脱 /。

3.)BANG(!)更新对象。我认为您最大的问题可能是您过度使用!

4.)您还使这一效率很低...您正在查看每个记录并更新每个记录。铁轨并不总是最好的选择。学习SQL并一行执行此操作:

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

如果您必须使用轨道:

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

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

其他提示

我要尝试的下一件事就是

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

至于没有回调的保存, 此stackoverflow页面 有一些建议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top