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.

Answers


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.


Need Your Help

How to improve my software project's speed?

java database performance hibernate

I'm doing a school software project with my class mates in Java.

Installing FLTK for Code::Blocks

c++ cmake cygwin codeblocks fltk

Searching online I have found that there are several ways one can try to use FLTK, most common is to circumvent the IDE and use the supported software make for Visual Studio.