106 votes

Rails filtrant un tableau d'objets par valeur d'attribut

J'ai donc effectuer une requête à la base de données et j'ai une gamme complète d'objets:

@attachments = Job.find(1).attachments

Maintenant que j'ai un tableau d'objets que je ne veux pas effectuer une autre base de données de la requête, mais je voudrais filtrer le tableau basé sur l' Attachment de l'objet file_type afin que je puisse avoir une liste d' attachments où le type de fichier est - 'logo' , puis une autre liste d' attachments où le type de fichier est - 'image'

Quelque chose comme ceci:

@logos  = @attachments.where("file_type = ?", 'logo')
@images = @attachments.where("file_type = ?", 'image')

Mais en mémoire au lieu d'un db de la requête.

Cheers

187voto

Vik Points 2959

Essayez:

C'est bon :

 @logos = @attachments.select { |attachment| attachment.file_type == 'logo' }
@images = @attachments.select { |attachment| attachment.file_type == 'image' }
 

mais pour des raisons de performances, vous n'avez pas besoin d'itérer @attachments deux fois:

 @logos , @images = [], []
@attachments.each do |attachment|
  @logos << attachment if attachment.file_type == 'logo'
  @images << attachment if attachment.file_type == 'image'
end
 

10voto

soundar Points 3499

Si vos pièces jointes sont

 @attachments = Job.find(1).attachments
 

Ce sera un tableau d'objets d'attachement

Utilisez la méthode select pour filtrer en fonction du type_fichier.

 @logos = @attachments.select { |attachment| attachment.file_type == 'logo' }
@images = @attachments.select { |attachment| attachment.file_type == 'image' }
 

Cela ne déclenchera aucune requête de base de données.

2voto

Siwei Shen Points 5814

Avez-vous essayé de charger avec impatience?

 @attachments = Job.includes(:attachments).find(1).attachments
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X