2016-05-11 7 views
0

Salut tout le monde j'ai besoin d'aide avec cette méthode: J'ai une méthode qui boucle les données de deux modèles et les compare; Si une correspondance est trouvée, je souhaite définir l'attribut de correspondance nih_pub sur true, puis renvoyer tous les nih_pub dont la correspondance est false. ça woks bien si j'utilise l'instruction si commentée if nih.pubyear == "2003" and nih.pmid == "12538806", mais il ne fonctionne pas avec la boucle.les rails changent la valeur booléenne dans une boucle

ci-dessous est la méthode que je suis en utilisant:

def compare 
    nih_pub = NihPublication.where(user: current_user).all 
    pubmed_pub = Publication.where(user: current_user).all 

    nih_pub.each{ |nih| 
    pubmed_pub.each {|pubmed| 
     if nih.pubyear == pubmed.publication_year and nih.pmid == pubmed.pubmed_id 
     # if nih.pubyear == "2003" and nih.pmid == "12538806" 
     nih.match = true 
     nih.save! 
     end 
    } 
    } 

    @missing = nih_pub.where(match: false) 
end 

Merci pour votre aide

+0

On ne sait pas: êtes-vous avoir un problème avec la logique de condition du 'if' non commenté (et comment' if' a fonctionné correctement) OU avez-vous un problème avec la sortie de la boucle? –

+0

vous pouvez écrire l'instruction 'return' dans la condition' if', de sorte qu'elle retourne de la boucle et vous donne '@ missing' comme sortie. –

+0

Désolé; le problème que j'ai est que ce code n'est pas exécuté 'nih.match = true nih.save!'. si j'utilise l'instruction commentée if, tout fonctionne. – Idriss

Répondre

1

Ceci est probablement un problème de type de données. Vous pouvez comparer les types de données dans votre console comme ceci:

def compare 
    nih_pub = NihPublication.where(user: current_user).all 
    pubmed_pub = Publication.where(user: current_user).all 

    nih_pub.each{ |nih| 
    pubmed_pub.each { |pubmed| 
     puts "nih.pubyear #{nih.pubyear.class.name}" 
     puts "pubmed.publication_year #{pubmed.publication_year.class.name}" 
     puts "nih.pmid #{nih.pmid.class.name}" 
     puts "pubmed.pubmed_id #{pubmed.pubmed_id.class.name}" 

     if nih.pubyear == pubmed.publication_year and nih.pmid == pubmed.pubmed_id 
     # if nih.pubyear == "2003" and nih.pmid == "12538806" 
     nih.match = true 
     nih.save! 
     end 
    } 
    } 

    @missing = nih_pub.where(match: false) 
end 

Si vous voyez quelque chose comme ceci:

nih.pubyear Integer 
pubmed.publication_year String 
nih.pmid Integer 
pubmed.pubmed_id String 

vous alors vous savez que vous devez jeter des valeurs quand on les compare.

Je soupçonne que vous aurez besoin de changer votre code pour quelque chose comme ça (bien que ce soit seulement une estimation et est basée sur la sortie de débogage J'ai énuméré ci-dessus):

def compare 
    nih_pub = NihPublication.where(user: current_user).all 
    pubmed_pub = Publication.where(user: current_user).all 

    nih_pub.each{ |nih| 
    pubmed_pub.each { |pubmed| 
     # Cast those strings to integers so you're comparing apples to apples. 
     if nih.pubyear == pubmed.publication_year.to_i and nih.pmid == pubmed.pubmed_id.to_i 
     nih.match = true 
     nih.save! 
     end 
    } 
    } 

    @missing = nih_pub.where(match: false) 
end 
+0

Merci! Maintenant j'utilise '.to_i' au lieu de' "# {}" ' – Idriss

+0

@Idriss De rien. –