2009-10-27 4 views
2

Je voudrais de ne pas dupliquer l'image si elle est la même qui est affiché,Paperclip - duplication des images

Comme:

USER1 poster une image
USER2 publier la même image

2 # images dans le db

Y at-il un moyen de gérer cela ??

Merci,

+0

Juste pour être sûr, mais êtes-vous sûr de vouloir faire cela? Comment un fichier est-il supprimé? Est-il logique que deux utilisateurs créent un lien vers le même fichier? – JRL

+0

J'ai pris des utilisateurs comme exemples mais dans mon cas oui c'est logique, mais tu as raison c'était un peu paresseux c'était juste un peu paresseux pour tout expliquer ^^ – Mike

Répondre

0

Pour ce faire, vous devez diviser vos pièces jointes dans leur propre modèle.

Alors, où vous avez probablement maintenant

class User < ActiveRecord::Base 
    has_attached_file :avatar #plus a bunch of specifications here 
end 

Vous feriez installer un nouveau modèle et les associations comme

class User < ActiveRecord::Base 
    belongs_to :images 
end 

class Image < ActiveRecord::Base 
    has_many :users 
    has_attached_file :avatar 
end 

Ensuite, dans votre contrôleur, vous devez faire

Image.find_or_create_by_avatar_file_name(#filename here) 

Vous disposez maintenant d'un attribut user.image_id et vous pouvez associer une seule image à plusieurs utilisateurs. Cependant, j'ai construit un certain nombre de systèmes assez volumineux avec des téléchargements de photos d'utilisateurs (photos de badge, photos d'avatars, images amusantes, peu importe) et le chevauchement réel entre les utilisateurs tend à être assez faible. De plus, vous économisez seulement de l'argent sur ce qui est le moins cher de vos ressources: l'espace de stockage. Vous ne sauvegardez rien sur les coûts de bande passante, le traitement ou la complexité programmatique en suivant cette route.

À moins que ce soit un ensemble de circonstances vraiment unique (dans ce cas, il serait bon d'entendre ce que vous faites), je déconseille d'aller dans cette voie.

+0

oui je peux avoir une seule image téléchargée associée à plusieurs utilisateurs, mais ... comment Je compare une nouvelle image téléchargée avec l'autre? – Mike

+0

J'ai ajouté du code de contrôleur à ma réponse. Vous auriez besoin de trier le nom de fichier téléchargé et peut-être faire une comparaison sur la taille. –

+0

Merci, pour votre réponse complète, vous avez certainement raison -> le stockage est bon marché même avec des milliers de doublons, c'est ok ... – Mike

0

Calculez le hachage de chaque image lors de son enregistrement. Lorsqu'un utilisateur de nouveaux messages même image, vérifier le hachage de cette image et voir si elle correspond à quelque chose dans la base de données

+0

oui c'est ce que je pensais mais je crains juste de faire un hash sur une image temps avant d'enregistrer serait un peu lent (mais n'a pas essayé) – Mike

1

http://www.codeproject.com/Messages/2913691/Comparing-one-image-to-many-others-speeded-up.aspx

Je l'utilise dans mon programme et tout va bien!

DB conseils connexes: stocker les hachages dans le tableau. et alors vous avez juste besoin d'un calcul de hachage.

A propos de la vitesse

1) Contraindre taille de l'image 100x100 par exemple

2) Lorsque l'utilisateur essaie de se connecter, hachage de son mot de passe calculé. Je pense que les utilisateurs vont se connecter plus fréquemment, puis mettre à jour leurs avatars.

+0

qui a du sens, je vais essayer que ce soir, Merci – Mike

Questions connexes