2017-09-20 2 views
0

J'ai 2 tables « existing_practices » & « latest_practices », les deux contiennent une colonne « practice_id »Comparaison 2 tables dans les rails 5

Ce que je veux faire est de comparer latest_practices avec les existing_practices pour trouver les pratiques sont sur la latest_practices tableau que je n'ai pas sur mes existing_practices (en d'autres termes, je dois trouver les nouvelles pratiques)

Exemple:

existing_practices  latest_practices 
------------------  ------------------ 
practice_id    practice_id 
A123     A123 
B123     B123 
C123     C123 
         D123 

donc, étant donné les 2 ci-dessus les tableaux I aurait besoin d'identifier que « D1 23 "est une nouvelle pratique.

Je l'ai essayé ce qui suit, mais il ne semble pas fonctionner:

existing_practices = ExistingPractice.select(:practice_id).all 
latest_practices = LatestPractice.select(:practice_id).all 

new_practices = latest_practices.to_a - existing_practices.to_a 

Je pense la meilleure façon est d'écrire juste le sql cru, mais je veux faire les rails façon (si il existe une).

Quelqu'un peut-il aider?

Répondre

2

plumer utilisée pour récupérer la valeur de la colonne sous forme de tableau

new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id) 
0

Si vous avez beaucoup de données, la solution de plumer practice_id et en les soustrayant est peu performante. Au lieu de cela, je suggère:

okish:

LatestPractice.where.not(practice_id: ExistingPractice.select(:practice_id).map(&:practice_id)) 

mieux:

LatestPractice.where.not("EXISTS(SELECT 1 from existing_practices where latest_practices.practice_id = existing_practices.practice_id)") 

beaucoup mieux:

LatestPractice.where('practice_id NOT IN(SELECT DISTINCT(practice_id) FROM existing_practices)') 
0

Vous peut utiliser SQL directement pour de meilleures performances.

new_practices_id = ActiveRecord::Base.connection.execute("SELECT DISTINCT latest_practices.practice_id FROM latest_practices LEFT JOIN existing_practices ON latest_practices.practice_id = 
existing_practices.practice_id WHERE existing_practices.practice_id IS NULL") 

Cela retourne un tableau de la practice_id qui n'existe pas à la table existing_practices.

ici est l'exemple du violon company two columns or tables

vous pouvez le faire comme ça avec pluck

new_practices = LatestPractice.pluck(:practice_id) - ExistingPractice.pluck(:practice_id) 
+0

Je dis que c'est plus comme façon ruby, mais je ne commettrais pas ce code à la production. – radubogdan

+0

@radubogdan il demande seulement dans les rails. par la façon dont vous allez chercher la ligne de table mais il a demandé à id comme tableau. première lecture correcte de la question – krishnar

+0

@krishnar Tout d'abord, la seule question qu'il se pose est: «Quelqu'un peut-il aider? En second lieu, il montre seulement ce qu'il a fait, cela ne signifie pas que vous devez le suivre. Troisièmement, cette solution ne fonctionne pas bien pour M des enregistrements. À votre santé. – radubogdan