Wie kann ich nur einen Datensatz anstelle von Duplikaten mit Activerecord in Rails?
-
28-09-2019 - |
Frage
Ich habe ein Modell wie folgt:
Campaign
has_many :companies, :through => :contacts
Es gibt viele Kontakte mit der gleichen Firma. Ich möchte nur eine Instanz jedes Unternehmens.
Ich habe versucht, die folgenden:
@campaign = Campaign.find(params[:id])
@companies = @campaign.companies
Aber diese zeigt mir alle Unternehmen für jeden Kontakt, glaube ich. Zumindest das ist, was die Ausgabe aussieht.
Wie kann ich sicherstellen, dass nur eine Instanz eines Unternehmens hinzugefügt wird?
Lösung
Wenn Sie :through
verwenden, ist es in der Regel sinnvoll, die :uniq
Option zu verwenden, so dass Sie nicht wiederholt Ergebnisse erhalten
has_many :companies, :through => :contacts, :uniq => true
Andere Tipps
Die derzeit akzeptierte Lösung von „j“. wird Arbeit, aber es ist sehr ineffizient, weil es die Duplikate in Ruby, statt in SQL entfernt. Es eigentlich nur läuft .uniq!
auf den zurückgegebenen Ergebnissen.
Die effiziente und, meiner Meinung nach, richtiger Weg, dies zu tun ist:
has_many :companies, :through => :contacts, :select => "DISTINCT companies.*"
Es ist vielleicht nicht so schön sein, aber es wird Sie bekommen, was Sie wollen, werden keine zusätzlichen Speicher verwenden, und wird viel schneller sein.