2015-07-29 29 views
5

Nel mio progetto RoR, esiste un modello Cliente con 10 attributi. Ora voglio trovare quei clienti che hanno almeno tre attributi comuni. Come posso rendere questa query in modo efficiente?Trova record duplicato per 3 attributi comuni

Probabilmente è una soluzione:

Customer.select([:first_name,:last_name,:language]). 
     group(:first_name,:last_name,:language).having("count(*) > 1") 

Ma questa soluzione richiesta troppi combinazione per controllare. Si prega di aiutare con una soluzione migliore.

Grazie! In anticipo.

+0

No, questa è una domanda diversa. Quanto sopra è dove sappiamo esattamente che queste due colonne corrispondono. Questa domanda chiede se due delle tre possibili colonne corrispondono a –

+0

@Taryn East: Purtroppo questa soluzione non risolve il mio problema. Perché mi aspetto che quei clienti abbiano almeno tre attributi comuni. Comunque, grazie, per il tuo commento. –

+0

non ho suggerito una soluzione. Ho votato contro la chiusura e ho dato la mia ragione per non aver votato a chiudere-come-duplicato. Il mio commento era per il ragazzo che ha votato per chiudere come duplicato, non per te, mi dispiace, non ho una soluzione. –

risposta

0

Questo è il meglio che posso inventare finora. Inoltre non è una soluzione SQL.

# Arrange a 3-items combination of columns, removed id and timestamps 
triplets = Customer.column_names.reject {|column| column == "id" || column == "created_at" || column == "updated_at"}.combination(3).to_a 

#Group All records by same item values for each 3-items combination 
all = Customer.all 
res = triplets.map do|t| 
    all.to_a.group_by {|c| [ {t[0] => c.send(t[0].to_sym)}, { t[1] => c.send(t[1].to_sym) }, {t[2] => c.send(t[2].to_sym)} ]} 
end 
# removed combinations with only 1 record 
final_result = res.map {|h1| h1.reject { |k, v| v.count <= 1}} 

# There you have customer with 3 attributes common combinations 
+0

Grazie mille per la risposta ... –