2015-02-23 2 views
0

Ceci est mon contrôleur:Rails - Réduire les requêtes à l'aide comprend

@trainings = Training.includes(:courses).order(:id, 'courses.order_id ASC') 

À mon avis, pour chaque formation, je dois faire une boucle pour 3 fois et vérifier si a un cours avec colonne order_id avec ces valeurs:

@trainings.each do |training| 
    for course_order in (1..3) do 
     this_course = training.courses.find_by(order_id: course_order) 
     # this_course.image(:resized) #i can print the paperclip image 
    end 
end 

Le code ci-dessus exécute tant de requêtes, donc j'ai essayé d'utiliser la méthode select:

@trainings.each do |training| 
    for course_order in (1..3) do 
     this_course = training.courses.select { |course| course.order_id = course_order } 
     # this_course.image(:resized) #I cannot print paperclip image, because the result is an Array, so doesn't know the method "image" 
    end 
end 

J'ai donc une seule requête, mais je ne peux pas appeler la méthode image de mon modèle, car le résultat est un objet tableau.

Je sais que je peux utiliser:

training.courses.each do |course| 
    # course.image(:resized) 
end 

et je vais juste une question, mais je dois boucle 3 fois, quand je n'ai pas la ligne que je peux imprimer une image d'espace réservé, comme:

Example image http://www.onrails.com.br/order_id.jpg

+0

'order_id' ne peut être que de 1 à 3? –

Répondre

1

Votre

this_course = training.courses.find_by(order_id: course_order) 

retours premier enregistrement m Conditions de atches, mais

this_course = training.courses.select { |course| course.order_id == course_order } 

sélectionne tous les cours qui correspondent à la condition. Si vous voulez trouver seul le premier, utilisez .detect au lieu de .select:

this_course = training.courses.detect { |course| course.order_id == course_order } 

vous avez également une faute de frappe. = est pour l'affectation, == est pour la comparaison.

+0

Je pense qu'en utilisant détecter je vais toujours obtenir un résultat, y compris cela ne correspond pas. C'était mon résultat: [IMAGE] (http://www.onrails.com.br/detect.jpg). –

+0

@ LuizGustavoF.Gama voir la mise à jour de la réponse. Vous obtenez toujours un résultat, à cause de '='. Changez-le en '=='. –

+0

Hhahaha omg, bien sûr! Merci mon pote. –