Rails-帮助完成耙子任务
-
13-10-2019 - |
题
我有一个耙子任务,我需要运行以便对数据库中的某些数据进行消毒(删除前向斜线)。这是任务:
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, '/', '');"
哇!一个查询。惊人! :)
其他提示
不隶属于 StackOverflow