2015-07-29 13 views
5

W moim projekcie RoR istnieje model klienta z 10 atrybutami. Teraz chcę znaleźć tych klientów, którzy mają co najmniej trzy wspólne atrybuty. Jak sprawnie wykonać to zapytanie?Znajdź zduplikowany rekord dla 3 wspólnych atrybutów

Prawdopodobnie jest to rozwiązanie:

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

Ale to rozwiązanie wymaga zbyt wiele, aby sprawdzić połączenie. Pomóż w lepszym rozwiązaniu.

Dzięki! Z góry.

+0

Nie, to jest inne pytanie. Powyższe jest, gdy dokładnie wiemy, że te dwie podane kolumny pasują do siebie. To pytanie zadaje pytanie, czy dwie z trzech możliwych kolumn pasują do –

+0

@Taryn East: Niestety to rozwiązanie nie rozwiązuje mojego problemu. Ponieważ oczekuję tych klientów, którzy mają co najmniej trzy wspólne atrybuty. W każdym razie, dzięki, za twój komentarz. –

+0

Nie zaproponowałem żadnego rozwiązania. Głosowałem przeciwko zamknięciu sprawy i podałem powód, dla którego nie głosowałem, aby zamknąć sprawę jako duplikat. Mój komentarz był dla faceta, który głosował, aby zamknąć jako duplikat, nie dla ciebie - przepraszam - nie mam rozwiązania. –

Odpowiedz

0

Jest to najlepsze, co mogę wymyślić do tej pory. Również nie jest rozwiązaniem 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

Bardzo dziękuję za odpowiedź ... –

Powiązane problemy