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

我目前正在尝试使用一堆虚假数据填充项目上的开发数据库,​​以模拟它与数百篇文章/用户的外观和操作方式。 我查看了不同的gem来完成任务 – 例如Factory Girl,但是文档非常缺乏,我没有得到它 – 但最终使用了Populator和Fakergem并执行了以下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只对数据库进行直接填充而不必通过ActiveRecordvalidation来执行此操作。因此我认为Paperclip无法运行以生成所有不同的缩略图并且需要(并上传到正确的目录)对于头像,如果我只是在上面的rake任务中填充了一个文件路径的字段。

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

UPDATE

最终的解决方案,基于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目录中上传所有记录中的化身。

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

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

其中sampleimages是包含随机关联的化身的目录

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

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

假设您的模型是“用户”,它有一个头像。 然后你可以做以下事情:

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

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