Monkeypatch rake任务中的模型使用插件提供的方法?

时间:2010-04-17 12:22:55

标签: ruby-on-rails plugins rake monkeypatching

在最近的一些重构中,我们更改了用户头像的存储方式,但没有意识到一旦部署它就会影响所有现有用户。所以现在我正在尝试编写一个rake任务来解决这个问题。

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

当我尝试运行时,虽然我为用户获取了未定义的方法`has_attached_file':Class

我可以在脚本/控制台中执行此操作,但似乎无法从rake任务中找到paperclip插件的方法。

1 个答案:

答案 0 :(得分:2)

rake任务可能没有加载完整的Rails环境。您可以通过执行以下操作来强制执行此操作:

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

路径指向您的environment.rb文件。如果要解决此问题,则应将其专门包含在此任务中,因为您可能不希望默认情况下所有rake任务都包含环境。事实上,rake任务可能甚至不是你想要做的事情的最佳场所。您也可以尝试在脚本目录中创建脚本。