2011-04-26 11 views
19

Actualmente estoy intentando completar una base de datos de desarrollo en un proyecto con un montón de datos falsos, para simular cómo se verá y funcionará con cientos de artículos/usuarios. Busqué diferentes gemas para hacer la tarea, como Factory Girl, pero faltó documentación y no la obtuve, pero terminé usando las gemas Populator y Faker e hice la siguiente tarea de rake ...Generación de cargas de imágenes de Paperclip con datos falsos - Ruby on Rails Populator/Faker Gems

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 

Funciona muy bien ... para datos basados ​​en texto. Sin embargo, todos los usuarios tienen un avatar que se puede subir a través de archivos adjuntos de Paperclip, y todos los contenidos regulares tienen archivos adjuntos en miniatura de la misma manera.

entiendo la gema Populator simplemente hace una población directamente a la base de datos y no necesariamente corriendo a través de validaciones ActiveRecord hacer so..therefor asumiría Paperclip no puede funcionar para generar todas las diferentes miniaturas y necesitaba (y subido a el directorio apropiado) para el avatar si acabo de llenar el campo con un camino de archivo en la tarea anterior.

¿Hay alguna manera de poblar imágenes falsas, a través de Populator o de otra manera? ¿O tal vez una forma de señalar la tarea de rake en un directorio de imágenes de stock en mi disco duro para autogenerar miniaturas aleatorias para cada registro? Hizo una búsqueda en Google por un camino, pero no se ha encontrado mucha información sobre el tema.

ACTUALIZACIÓN

La solución final, basado en la línea de pwnfactory de pensar ...

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 

Es básicamente un bucle de vuelta alrededor y subido por los avatares del directorio sampleimages en todos los registros.

Respuesta

7

para asociar una imagen al azar en su tarea, puede probar lo siguiente:

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

donde sampleimages es un directorio que contiene los avatares que se asocian al azar

+0

Probé esto e inserté esa línea en mi tarea de rake (y creé el directorio de imágenes de muestra en mi proyecto de raíles propiamente) pero escupió "rake abortado! método indefinido' avatar = 'para # "al ejecutar la tarea. Dado que la base de datos divide las columnas en tres (avatar_file_name, avatar_content_type, avatar_file_size), esa podría ser la razón. – Shannon

+0

Debe utilizar el nombre que definió en su modelo, por ejemplo: ' clase Photo acw

+0

... Eso es lo que estoy haciendo, el archivo adjunto a mi modelo de Usuario se llama 'avatar' (has_attached_file: avatar). – Shannon

0

Una forma de evitar esto es poner un condicional en mi opinión.

Digamos que su modelo es "usuario", y tiene un avatar. A continuación, puede hacer lo siguiente:

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

Esto funciona para mí con el Paperclip, y lo uso en mi base de datos dev todo el tiempo en lugar de preocuparse por tener toda la imagen adjunta a todos los usuarios.

+2

fuera de tema, pero hay es otra forma de hacerlo ... si usa una default_url en su has_attached_file en su modelo, la llamada del clip en sus vistas volverá a la imagen predeterminada si no se encuentra una imagen cargada. Práctico y reduce el código de vista. En cuanto a mi situación, ya tengo a mis usuarios configurados de esa manera, pero quiero ver algo de aleatoriedad ... sin mencionar que el contenido TIENE que tener una imagen adjunta, no hay una versión alternativa. – Shannon

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