2016-04-27 8 views
0

Ich habe ein route ModellRails Active verbindet und Duplikate Daten

class Route < ActiveRecord::Base 
    has_many :etapes 
    acts_as_mappable :through => :steps 
end 

und ein step ein (enthält lat und LGN)

class Step ActiveRecord::Base 
    belongs_to :route 
    acts_as_mappable 
end 

Ich versuche, die am nächsten route zu bekommen zu einem bestimmten Punkt.

Mit dieser Anfrage Route.joins(:etapes).within(10, :origin => [1.23456,-5.3269]) Ich kann die route s bekommen, aber ich habe Informationen Duplikate (weil diese route viele Schritte hat schließt zu dem gegebenen Punkt):

#<ActiveRecord::Relation [ 
#<Route id: 1, created_at: "2016-03-26 21:53:01", updated_at: "2016-03-26 21:53:01">, 
#<Route id: 1, created_at: "2016-03-26 21:53:01", updated_at: "2016-03-26 21:53:01"> 
]> 

Was kann ich tun, um Duplikate Einträge zu entfernen?

+1

'Route.joins (: etapes) .within (10,: Herkunft => [1.23456, -5.3269]). Uniq' - probiere das – dp7

Antwort

0

My easy go-to würde

Route.joins(:etapes).within(10, :origin => [1.23456,-5.3269]).group(:id)

sein Dies erzeugt ein GROUP BY `routes`.`id`, die für grundlegende Abfragen erhalten Sie, was Sie wollen. Wenn Sie diese benötigen, müssen Sie jedoch die Strategien ändern, da die COUNT innerhalb der Gruppe gilt.

Ich tendiere dazu, die uniq Lösung für diesen Zweck zu vermeiden, wie ich es gefunden habe, kläglich durchzuführen. Nicht sicher, ob das verallgemeinert wird, aber es kann damit zu tun haben, dass es eine SELECT DISTINCT `routes`.* generiert, die alle Spalten vergleicht, obwohl Sie wirklich nur die DISTINCT ID benötigen.

+0

Nice one. @AndrewSchwartz Wenn ich alle Routen bekommen möchte, die 2 Schritten entsprechen, wie könnte ich das tun? Ich möchte das Ergebnis Route.joins (: etapes) .within (10, origin => [1,23456, -5,3269]) Gruppe. (: Id) und Route.joins (: etapes) .within (10,: Herkunft => [43.604408, 1.440736]). Group (: id) –

+0

Ich frage mich, ob acts_as_mappable eine Lösung dafür hat. Wenn nicht, wäre mein Instinkt, mit Tabellenaliasnamen zu gehen, die es Ihnen erlauben, sich unter zwei unabhängigen Bedingungen an denselben Tisch zu setzen. Ich müsste wissen, was die "innere" Methode tut, um zu wissen, wie man diese Idee anwendet. Die allgemeine Idee ist zu sagen "Foo.joins (" innere Join-Bars b1 auf b1.foo_id = foos.id und innere Join-Bars b2 auf b2.foo_id und ")" . Mir ist nur nicht klar, dass Sie das tun können, ohne sich in die "innere" Methode zu hacken. –

+0

Danke, ich werde sie fragen. –