I am trying to create a custom rake task, but it seems I dont have access to my models. I thought this was something implicitly included with rails task.
I have the following code in lib/tasks/test.rake:
namespace :test do
task :new_task do
puts Parent.all.inspect
end
end
And here is what my parent model looks like:
class Parent < ActiveRecord::Base
has_many :children
end
It's a pretty simple example, but I get the following error:
/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent
(See full trace by running task with --trace)
Any ideas? Thanks
When you begin writing your rake tasks, use a generator to stub them out for you.
For example:
You'll get a stub created in lib/tasks called
my_tasks.rake
(obviously use your own namespace.) Which will look like this:All your rails models etc. will be available for the current environment from within each task block, unless you're using the production environment, in which case you need to require the specific models you want to use. Do this within the body of the task. (IIRC this varies between different versions of Rails.)
Generate task using below command (namespace with task name):
Use below syntax to add logic:
Run above task using below command:
or
you might need to require your configuration (which should specify all your required models etc)
eg:
alternatively you can just require each seperately, but you might have environment issues AR not set up etc)
Figured it out, the task should look like:
Notice the
=> :environment
dependency added to the taskWith the new ruby hash syntax (Ruby 1.9) the environment will be added like this to the rake task:
The :environment dependency is quite correctly called out, but rake still may not know about other gems that your models depend on - in one case of mine, 'protected_attributes'.
The answer is to run:
This guarantees that the environment includes any gems specified in your Gemfile.