3

My rails task looks like this:

  desc 'Delete records older than 7 days'
  task :delete_old_records => :environment do
  Post.delete_all('created_at < ?', 7.days.ago)
  end

I tried to execute the task using:

 rake delete_old_records --trace

and it results to this error:

** Invoke delete_old_records (first_time)                                                                                                                                                                                                                             
** Invoke environment (first_time)                                                                                                                                                                                                                                    
** Execute environment                                                                                                                                                                                                                                                
** Execute delete_old_records                                                                                                                                                                                                                                         
rake aborted!                                                                                                                                                                                                                                                         
ArgumentError: wrong number of arguments (2 for 0..1)                                                                                                                                                                                                                 
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0/lib/active_record/relation.rb:453:in `delete_all'                                                                                                                                       
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0/lib/active_record/querying.rb:8:in `delete_all'                                                                                                                                         
/home/codio/workspace/lib/tasks/delete_old_records.rake:3:in `block in <top (required)>'                                                                                                                                                                              
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:240:in `call'                                                                                                                                                                 
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:240:in `block in execute'                                                                                                                                                     
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:235:in `each'                                                                                                                                                                 
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:235:in `execute'                                                                                                                                                              
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain'                                                                                                                                      
/home/codio/.rbenv/versions/2.1.5/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'                                                                                                                                                                                  
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:172:in `invoke_with_call_chain'                                                                                                                                               
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/task.rb:165:in `invoke'                                                                                                                                                               
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:150:in `invoke_task'                                                                                                                                                   
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'                                                                                                                                 
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `each'                                                                                                                                                          
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:106:in `block in top_level'                                                                                                                                            
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:115:in `run_with_threads'                                                                                                                                              
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:100:in `top_level'                                                                                                                                                     
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:78:in `block in run'                                                                                                                                                   
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:176:in `standard_exception_handling'                                                                                                                                   
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/lib/rake/application.rb:75:in `run'                                                                                                                                                            
/home/codio/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/rake-10.4.2/bin/rake:33:in `<top (required)>'                                                                                                                                                              
/home/codio/.rbenv/versions/2.1.5/bin/rake:23:in `load'                                                                                                                                                                                                               
/home/codio/.rbenv/versions/2.1.5/bin/rake:23:in `<main>'    

Does anyone know what I could be doing wrong here? My model looks like:

class Post < ActiveRecord::Base
end

and rake-gem version is rake-10.4.2

mr i.o
  • 952
  • 2
  • 10
  • 20

2 Answers2

1

You could do something like this:

timestamp = Time.now - 7.days
posts = Post.where('created_at < ?', timestamp)
posts.each { |post| post.destroy }

7.days.ago returns a class of ActiveSupport::TimeWithZone.

Time.now - 7.days will return a Time object, which is what you need.

Or you could give this a shot:

posts = Post.where('created_at < ?', timestamp).destroy_all

Not quite sure what broke on your end, but his works for me in my console using a basic Rails model.

NM Pennypacker
  • 6,704
  • 11
  • 36
  • 38
  • Still getting the same error:. ------------------------------------------ desc 'Delete records older than 7 days' task :delete_old_records => :environment do timestamp = Time.now - 7.days Post.delete_all('created_at < ?', timestamp) end – mr i.o Aug 05 '15 at 15:19
  • Not quite sure what broke delete_all. I updated the answer with another possible solution. If that doesn't work you might have to live with iterating through the results. FWIW, I've used similar code and haven't had trouble, especially with a task that only runs 1-2 times per day. – NM Pennypacker Aug 05 '15 at 16:19
  • Thanks for the effort Nick. I up voted your answer because it was useful indeed, but Naiyyar's suits my requirements better. – mr i.o Aug 06 '15 at 08:46
1

Try this

Post.delete_all(['created_at < ?', 7.days.ago])
Anna88
  • 345
  • 3
  • 11
  • Thanks Naiyyar. That worked! Can you shed more light on why the square brackets made all the difference please? – mr i.o Aug 06 '15 at 08:43
  • delete_all accepts 0 or 1 argument as your error message shows "ArgumentError: wrong number of arguments (2 for 0..1) " in your case it is considering 'created_at < ?' and '7.days.ago' like you have passed two argument. if you put condition in square brackets it will pass to it as a single argument. – Anna88 Aug 06 '15 at 11:40