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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top