使用虚假数据生成Paperclip图像上传 - Ruby on Rails Populator / Faker Gems

时间:2011-04-26 15:13:09

标签: ruby-on-rails paperclip

我目前正在尝试使用大量虚假数据填充项目上的开发数据库,​​以模拟它与数百篇文章/用户的外观和操作方式。我查看了不同的宝石来完成任务 - 例如Factory Girl,但是文档非常缺乏而且我没有得到它 - 但最终使用了Populator和Faker宝石并执行了以下rake任务......

namespace :db do
   desc "Testing populator"
   task :populate => :environment do
      require "populator"
      require "faker"

      User.populate 3 do |user|
         name = Faker::Internet.user_name   
         user.name = name
         user.cached_slug = name
         user.email = Faker::Internet.email
         user.created_at = 4.years.ago..Time.now
      end
   end
end

适用于基于文本的数据。但是,所有用户都有一个可以通过Paperclip附件上传的头像,以及所有常规内容都有相同的缩略图附件。

我理解Populator gem只对数据库进行直接填充,而不必通过ActiveRecord验证来执行此操作。因此我认为Paperclip无法运行以生成所有不同的缩略图并且需要(并上传到如果我只是在上面的rake任务中用文件路径填充了字段,那么这个头像的正确目录。

有没有办法通过Populator或其他方式填充假图像?或者也许是一种将rake任务指向我硬盘上的库存图像目录以自动生成每条记录的随机缩略图的方法?在Google上寻找方法,但没有提供有关该主题的更多信息。

更新

最终解决方案,基于pwnfactory的思路......

namespace :db do
  desc "Testing populator"
  task :populate => :environment do
    require "populator"
    require "faker"

    User.populate 3 do |user|
      name = Faker::Internet.user_name
      user.name = name
      user.cached_slug = name
      user.email = Faker::Internet.email
      user.created_at = 4.years.ago..Time.now
    end

    User.all.each { |user| user.avatar = File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample); user.save! }
  end
end

它基本上循环回来并从所有记录上的sampleimages目录上传了头像。

3 个答案:

答案 0 :(得分:7)

要在任务中关联随机图像,您可以尝试以下操作:

user.avatar = File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample)

其中sampleimages是包含随机关联的头像的目录

答案 1 :(得分:1)

user.avatar = File.open(Dir['app/assets/images/*.jpg'].sample)

答案 2 :(得分:0)

我解决这个问题的一种方法是在我的观点中加入条件。

假设你的模特是“用户”,它有一个头像。然后,您可以执行以下操作:

<% if product.avatar.exists? %>
  ... show the attached photo
<% else %>
  .. show a default photo
<% end %>

这适用于Paperclip,我一直在我的开发数据库中使用它,而不是担心将所有图像附加到所有用户。