Monkeypatch a model in a rake task to use a method provided by a plugin?
During some recent refactoring we changed how our user avatars are stored not realizing that once deployed it would affect all the existing users. So now I'm trying to write a rake task to fix this by doing something like this.
namespace :fix do desc "Create associated ImageAttachment using data in the Users photo fields" task :user_avatars => :environment do class User # Paperclip has_attached_file :photo ... <paperclip stuff, styles etc> end User.all.each do |user| i = ImageAttachment.new i.photo_url = user.photo.url user.image_attachments << i end end end
When I try running that though I'm getting undefined method `has_attached_file' for User:Class
I'm able to do this in script/console but it seems like it can't find the paperclip plugin's methods from a rake task.
the rake task is probably not be loading the full Rails environment. You can force it to do so by doing something like this:
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
where the path leads to your environment.rb file. If this were to fix the issue, you should include it inside this task specifically, because you probably do not want all your rake tasks to include the environment by default. In fact, a rake task may not even be the best place to do what you're trying to do. You could try creating a script in the script directory as well.